Простое регулярное выражение C # - PullRequest
1 голос
/ 08 октября 2009

У меня есть регулярное выражение, которое мне нужно сопоставить с путем, например: "C:\Documents and Settings\User\My Documents\ScanSnap\382893.pd~". Мне нужно регулярное выражение, которое соответствует всем путям, кроме тех, которые заканчиваются на '~' или '.dat'. У меня проблема в том, что я не понимаю, как сопоставить и свести на нет точную строку «.dat» и только в конце пути. то есть я не хочу совпадать с {d,a,t} в другом месте пути.

Я построил регулярное выражение, но не должен совпадать .dat

[\w\s:\.\\]*[^~]$[^\.dat]

[\w\s:\.\\]* Соответствует всем словам, пробелам, двоеточию, точкам и пробелам. [^~]$[^\.dat]$ Это приводит к сбою матчей, заканчивающихся на '~'. Похоже, что я должен быть в состоянии выполнить отрицательное совпадение для «.dat», но в моем тестере регулярных выражений это не удается.

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

Эта запись выглядит аналогично: Regex для сопоставления нескольких строк

Ответы [ 4 ]

5 голосов
/ 08 октября 2009

Вы хотите использовать негативный прогноз :

^((?!\.dat$)[\w\s:\.\\])*$

Кстати, ваша группа персонажей ([\w\s:\.\\]) не допускает тильду (~). Вы намеревались разрешить тильду в имени файла, если оно не было в конце? Если так:

^((?!~$|\.dat$)[\w\s:\.\\~])*$
3 голосов
/ 08 октября 2009

Следующее регулярное выражение:

^.*(?<!\.dat|~)$

соответствует любой строке, которая НЕ заканчивается на «~» или «.dat».

^             # the start of the string
.*            # gobble up the entire string (without line terminators!)
(?<!\.dat|~)  # looking back, there should not be '.dat' or '~'
$             # the end of the string

На простом английском языке: соответствует строке только при взгляде сзади с конца строки, нет подстроки '.dat' или '~' .

Редактировать: причина, по которой ваша попытка не удалась, заключается в том, что класс отрицанных символов [^ ...] просто отрицает один символ. Класс символов всегда соответствует одному символу. Поэтому, когда вы делаете [^ .dat], вы не отрицаете строку «.dat», а сопоставляете один символ, отличный от «.», «D», «a» или «t».

2 голосов
/ 08 октября 2009
^((?!\.dat$)[\w\s:\.\\])*$

Это просто комментарий к предложению более раннего ответа:

. в классе символов [] - это литерал. и не нуждается в побеге.

^((?!\.dat$)[\w\s:.\\])*$

Извините, что опубликовал это как новое решение, но у меня явно недостаточно правдоподобия, чтобы просто прокомментировать ответ.

0 голосов
/ 08 октября 2009

Я полагаю, вы ищете это:

[\w\s:\.\\]*([^~]|[^\.dat])$

, который находит, как и прежде, все символы слова, пробелы, точки (.), Косые черты. Затем соответствует либо тильде (~), либо '.dat' в конце строки. Вы также можете добавить каретку (^) в самом начале, если знаете, что строка должна быть в начале новой строки.

^[\w\s:\.\\]*([^~]|[^\.dat])$
...