PDA

Показать полную графическую версию : [решено] regexp. не закрытые скобки


neprotiv
31-10-2012, 18:33
помогите пожалуйста
нужен regexp для поиска в тотал командере файлов которые имеют такой вид
пример
слово1_-_слово2-(50505050)-слово4-слово5)-слово6
слово1_-_слово2-(50505050)-слово4-(слово5-слово6
но не
слово1_-_слово2-(50505050)-слово4-(слово5)-слово6

тоесть может содержать

пробывал так но оно находит все три примера вышие
(\)(.){1,}[^\(](.){1,}[^\(]\))

Iska
31-10-2012, 21:06
(\)(.){1,}[^\(](.){1,}[^\(]\)) »
Точнее укажите, что именно Вам нужно получить. Ибо, судя по лишним скобкам, вам нужно не только найти, но и извлечь части имени (для дальнейшей работы?).

neprotiv
01-11-2012, 22:30
мне нужно найти неправильные имена файлов, тоесть если файл содержит лишнюю скобу - либо ( либо )
нашел примерный выход таким образом
(\)+[^\(]+[^\(]\)|\(+[^\)]+[^\)]\()
но оно ненаходит если файл выглядит так (лишняя скобка стоит очень близко с другой)
слово1_-_слово2-(50505050)-(слово4-слово5-слово6

Iska
02-11-2012, 04:19
neprotiv, если нужно просто найти файлы с потерянной скобкой — regexp не обязателен, достаточно просто посчитать количество открывающих и закрывающих скобок, затем сравнить эти количества.

Пример на WSH:
Option Explicit

Dim strFolder
Dim objFile


'strFolder = WScript.Arguments.Item(0)
strFolder = "E:\Песочница\0197"

With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strFolder) Then
For Each objFile In .GetFolder(strFolder).Files
If UBound(Split(objFile.Name, "(")) <> UBound(Split(objFile.Name, ")")) Then
WScript.Echo objFile.Name
End If
Next
Else
WScript.Echo "Folder [" & strFolder & "] not found"
End If
End With

WScript.Quit 0

слово1_-_слово2-(50505050)-слово4-(слово5-слово6.txt
слово1_-_слово2-(50505050)-слово4-слово5)-слово6.txt

если файл содержит лишнюю скобу - либо ( либо ( »
«либо ( либо (» — оригинально ;). Очевидно, имелось в виду «Либо «(», либо «)»»?

neprotiv
02-11-2012, 13:51
большое спасибо

«либо ( либо (» — оригинально . Очевидно, имелось в виду «Либо «(», либо «)»»? »
да))...опечатка

Iska
02-11-2012, 15:34
neprotiv, это именно то, что было потребно Вам?

neprotiv
05-11-2012, 22:53
да то только вот никак не пойму как прикрутить к тотал командеру и вообще как он работает (скрипт)

Iska
05-11-2012, 23:19
да то только вот никак не пойму как прикрутить к тотал командеру »
Это зависит от того, что Вы хотели бы получить в нём.

и вообще как он работает (скрипт) »
Для указанной папки:
strFolder = "E:\Песочница\0197"
скрипт перебирает все файлы. Имя каждого файла, представляющее собой строку символов, разбивается в массив, сначала по символу открывающей скобки, затем — закрывающей. Для каждого из двух полученных массивов получается значение верхней границы. Если полученные значения не равны — значит количество отрывающих и закрывающих скобок не одинаково.
If UBound(Split(objFile.Name, "(")) <> UBound(Split(objFile.Name, ")")) Then

neprotiv
05-11-2012, 23:36
мне надо чтоб он создал список файлов с полным путем
можно ли использовать его как кнопку?

Iska
06-11-2012, 00:21
1. В каком виде Вам нужен список файлов? В виде текстового файла? В виде сообщения?
2. Каких именно файлов? Из выделенных на панели?

neprotiv
06-11-2012, 00:27
список неправильных файлов в текстовом документе

Iska
06-11-2012, 05:20
список неправильных файлов в текстовом документе »
Куда, в какую папку, класть текстовый документ? Для чего вообще нужен текстовый документ — т.е., какова будет дальнейшая работа с найденными именами файлов с потерянными скобками?

Почему не ответили на второй вопрос — выделенных на панели файлов, всех файлов, або ещё каких?

P.S. Вот Вам пример — для выделенных на панели файлов:
Option Explicit

Dim objArgument
Dim objFile

Dim strMessage


If WScript.Arguments.Count <> 0 Then
strMessage = ""

For Each objArgument In WScript.Arguments
With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(objArgument) Then
With .GetFile(objArgument)
If UBound(Split(.Name, "(")) <> UBound(Split(.Name, ")")) Then
strMessage = strMessage & .Path & vbCrLf
End If
End With
End If
End With
Next

If Len(strMessage) <> 0 Then
WScript.Echo strMessage
End If
End If

WScript.Quit 0
Настройки для кнопки:
http://img690.imageshack.us/img690/2831/image00020121106042359.png




© OSzone.net 2001-2012