2014-12-04 31 views
0

我有一些字符串这样的:正则表达式返回带有下划线组未定义

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"] 

回答

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

尝试this.See演示。

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

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

       ^^^ 

\w*将消耗一切,第二组将没有机会接触到play.Change \w[a-zA-Z0-9]排除_从匹配,因为它在这里作为分隔符到您的第二组