正则表达式使用下划线组返回undefined

时间:2014-12-04 09:05:41

标签: javascript regex

我有一些像这样的字符串:

123a-124b.csv
123a_124b.csv
123-124b.csv
123_124.csv

我需要将这些数字与正则表达式匹配,所以我用javascript尝试了这两个正则表达式:

/^(\d+)\w*(?:.(\d+)\w*)?\.CSV$/i
/^(\d+)\w*(?:[-|_](\d+)\w*)?\.CSV$/i

在此上运行exec可为-提供正确的结果,但_匹配,但会返回undefined for the second named group。事实上,第一个正则表达式适用于除_之外的任何字符。例如123a=123b.csv正常工作。

知道什么是错的。

更多示例输出:

var TEST = /^(\d+)\w*(?:.(\d+)\w*)?\.CSV$/i;
> undefined
TEST.exec('123a_123b.csv')
> ["123a_123b.csv", "123", undefined]
TEST.exec('123a+123b.csv')
> ["123a+123b.csv", "123", "123"]
TEST.exec('123a=123b.csv')
> ["123a=123b.csv", "123", "123"]
TEST.exec('123a?123b.csv')
> ["123a?123b.csv", "123", "123"]

1 个答案:

答案 0 :(得分:3)

^(\d+)[a-zA-Z0-9]*(?:.(\d+)\w*)?\.CSV$

试试这个。看看演示。

http://regex101.com/r/yR3mM3/44

正则表达式的问题是^(\d+)\w*(?:_(\d+)\w*)?\.CSV$

                               ^^^  

\w*将消耗所有内容,第二组永远不会有机会发挥作用。将\w更改为[a-zA-Z0-9]以排除_匹配作为你的第二组的分界