正则表达式,用于匹配包含文件名及其扩展名的字符串

时间:2019-02-26 13:48:41

标签: 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,我想匹配用逗号(,)或分号(;)和其后的空格分隔的字符串,例如:

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

 or

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

这个想法是先匹配一个文件,然后再匹配0..n个文件。

现在出现了问题,我找不到第一个RegEx的问题。我已经遍历了很多次表达式,而且还没有发现错误。我将其放入RegEx调试工具中,并查看了RegEx的解释,它们都很有意义,但是不起作用。

编辑:我忘了提到第一个RegEx匹配,如果一个文件在字符串中(没有逗号或分号)。

2 个答案:

答案 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*)(?!$)|$)表示逗号只有在主表达式后没有输入结尾时才可以在主表达式之后。

演示:https://regex101.com/r/pDTxJh/3