Могу ли я улучшить простоту, используя отрицательный взгляд, чтобы найти последнюю папку в пути к файлу? - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь найти более простое решение для поиска пути к последней папке в списке файлов, который не содержит тип файла, но должен использовать обходные пути.Может ли кто-нибудь объяснить некоторые улучшения в моем следующем коде регулярных выражений?

Текст поиска:

c:\this\folder\goes\findme.txt
c:\this\folder\cant\findme.doc
c:\this\folder\surecanfind.txt
c:\\anothertest.rtf
c:\t.txt

RegEx:

(?<=\\)[^\\\n\r]+?(?=\\[^\\]*\.)(?!.*\.doc)

Ожидаемый результат:

‘goes’
‘folder’

Можно ли улучшить и упростить внешний вид RegEx?Спасибо за помощь.

1 Ответ

0 голосов
/ 25 октября 2018

В вашем исходном регулярном выражении:
(?<=\\)[^\\\n\r]+?(?=\\[^\\]*\.)(?!.*\.doc)

особо нечего улучшать с точки зрения использования обходных путей.

Необходимо сказать, что положительный взгляд позадирегулярное выражение, когда разрешено начинать совпадение.
Позитивный взгляд вперед необходим для прекращения расширения квантификатора +?.
А отрицательный взгляд вперед необходим для отмены недопустимых совпадений.

Возможно, вы сможете объединить оба взгляда в один.Но хранить их отдельно более эффективно, так как если оценка одного не удалась, она может пропустить оценку второго.


Однако , если вы ищете более эффективный /«обычный» Regex, я бы обычно использовал что-то вроде:
^.*\\(.+?)\\[^\\]+\.(?!doc).+$

вместо использования обходных путей, чтобы исключить все, кроме моего желаемого вывода из совпадения, я бы включил желаемый вывод в группу захвата.
это позволяет мне указывать регулярному выражению проверять совпадение только один раз на строку, а не после когда-либо \ символа.

Затем, чтобы получить желаемый результат, все, что мне нужно сделать, это захватитьсодержимое группы захвата 1 из каждого совпадения.

рабочий пример

orignal (98 150 шагов)
Группы захвата (66 586 шагов)

Надеюсь, это вам поможет

...