我有一些像这样的字符串:
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"]
答案 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]
以排除_
匹配作为你的第二组的分界