RegEx для сопоставления строки, содержащей имена файлов и их расширение - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующее RegEx:

(^[\w]+[\w|\s-]*\.[A-Za-z0-9]+$)(,|;\s*^[\w]+[\w|\s-]*\.[A-Za-z0-9]+$)*

Где,

^[\w]+[\w|\s-]*\.[A-Za-z0-9]+$

соответствует любой строке, содержащей, например:

"someFile.txt"

Это работает как ожидалось:Никакие пробелы в начале не должны иметь расширение (расширение не имеет значения).

С первым RegEx я хочу сопоставить строки, разделенные запятой (,) или точкой с запятой (;) и пробелом после этого, напримерas:

"someFile.txt, oneMoreFile.bat, anotherFile.doc"

 or

"someFile.txt; oneMoreFile.bat; anotherFile.doc"

Идея состояла в том, чтобы сопоставить один файл, а затем 0..n больше файлов после этого.

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

Редактировать: я забыл упомянуть, что первый RegEx соответствует, если один файл находится встрока (без запятой или точки с запятой).

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

У вашего регулярного выражения есть некоторые проблемы, связанные с тем, где вы положили конец ввода и чередование, и;.

Вы можете попробовать эту уменьшенную версию: /^([\w]+[\w|\s-]*\.[A-Za-z\d]+((,\s*)(?!$)|$))*$/

Это (,\s*)(?!$)|$)говорит, что запятая может быть после основного выражения, только если за ней не следует конец ввода.

Демо: https://regex101.com/r/pDTxJh/3

0 голосов
/ 26 февраля 2019

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

^\w[\w\s]*\.[A-Za-z0-9]+(?:[,;]\s*\w[\w\s]*\.[A-Za-z0-9]+)*$

Чтобы упростить объяснение, давайте предположим, что имена файлов просто содержат символы слова (\w) как для имени файла, так и для расширения.Затем мы могли бы написать следующий упрощенный шаблон:

^\w+\.\w+(?:[,;]\s*\w+\.\w+)*$

Это говорит о совпадении:

^         from the start of the string
\w+       an initial filename
\.        a dot
\w+       an initial extension
(?:       (do not capture quantity in parentheses)
    [,;]  a comma or semicolon separator
    \s*   optional whitespace in between previous and current filename
    \w+   a subsequent filename
    \.    a dot
    \w+   a subsequent extension
)*        zero or more such extra filenames
$         end of the string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...