我有以下正则表达式:
(^[\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,我想匹配用逗号(,)或分号(;)和其后的空格分隔的字符串,例如:
"someFile.txt, oneMoreFile.bat, anotherFile.doc"
or
"someFile.txt; oneMoreFile.bat; anotherFile.doc"
这个想法是先匹配一个文件,然后再匹配0..n个文件。
现在出现了问题,我找不到第一个RegEx的问题。我已经遍历了很多次表达式,而且还没有发现错误。我将其放入RegEx调试工具中,并查看了RegEx的解释,它们都很有意义,但是不起作用。
编辑:我忘了提到第一个RegEx匹配,如果一个文件在字符串中(没有逗号或分号)。
答案 0 :(得分:1)
您当前的模式在正确的轨道上似乎不起作用。我不会指出一些问题,而是建议使用这种正则表达式模式:
^\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
答案 1 :(得分:1)
您的正则表达式有一些问题,涉及您将输入的末尾放在何处以及和;的交替。
您可以尝试使用以下较小版本:/^([\w]+[\w|\s-]*\.[A-Za-z\d]+((,\s*)(?!$)|$))*$/
此(,\s*)(?!$)|$)
表示逗号只有在主表达式后没有输入结尾时才可以在主表达式之后。