正则表达式:匹配字符串

时间:2016-04-25 15:41:04

标签: javascript regex

我尝试使用以下格式的字符串中的JavaScript匹配数字:

NUM;#username;#NUM;#username

例如,在以下字符串中:

252;#Lemmywinks07;#27;#Trogdor

我会捕获 252 27

但是,我在构建捕获这两个数字的正则表达式时遇到了问题。我认为使用全局会匹配两者,但是当我运行以下内容时:

/\d+/g.exec("252;#Lemmywinks07;#27;#Trogdor");

它返回:[252]而不是[252,27]

我应该注意,我不想匹配用户名中的数字(用户名不仅仅是数字)。所以看起来我会匹配&#34 ;;#"之间的整数。或者#34;之前的整数#;#"。

提前致谢!

修改

现在,示例包括用户名中的数字。我不想匹配用户名中的数字。

3 个答案:

答案 0 :(得分:3)

当您想要获得所有比赛时,请不要使用exec,而是使用match

"252;#Lemmywinks;#27;#Trogdor".match(/\d+/g);

exec意味着迭代使用,你必须循环直到没有结果,而match立即给你一个数组。

要仅使用完整字段的数字,我不会在这里使用正则表达式,我只会拆分:

"252;#Lemmywinks;#27;#Trogdor".split(";#").map(Number).filter(v=>v===v)

(请注意,此解决方案还为您提供了直接数字而非字符串)

答案 1 :(得分:1)

如果用户名中没有数字......

要查找匹配项,您实际上想要使用match()函数而不是exec()

var input = '252;#Lemmywinks;#27;#Trogdor';
var output = input.match(/\d+/g); // yields ['252', '27'];

如果用户名确实有数字......

或者,您可以通过split()函数使用;#字符将现有字符串拆分为单个组件,并相应地测试每个部分:

var input = '252;#Lemmywinks2;#27;#Trogdor';
var output = input.split(/[;#]/).filter(function(x){ return (/^\d+$/g).test(x); }); 

答案 2 :(得分:1)

您可以匹配整行并使用以下正则表达式检索相应的组:

var linePattern = /(\d+);[^;]*;#(\d+);[^;]*/

然后data.match(linePattern)[1]将返回第一个数字,data.match(linePattern)[2]第二个数字和data.match(linePattern)[0]整行。

虽然这种方法比在行中匹配数字或在分隔符周围分割更重,但它的优点是检查一条线是否符合预期的模式,并避免为异常条目返回不一致的结果。