我尝试使用以下格式的字符串中的JavaScript匹配数字:
NUM;#username;#NUM;#username
例如,在以下字符串中:
252;#Lemmywinks07;#27;#Trogdor
我会捕获 252 和 27 。
但是,我在构建捕获这两个数字的正则表达式时遇到了问题。我认为使用全局会匹配两者,但是当我运行以下内容时:
/\d+/g.exec("252;#Lemmywinks07;#27;#Trogdor");
它返回:[252]而不是[252,27]
我应该注意,我不想匹配用户名中的数字(用户名不仅仅是数字)。所以看起来我会匹配&#34 ;;#"之间的整数。或者#34;之前的整数#;#"。
提前致谢!
修改
现在,示例包括用户名中的数字。我不想匹配用户名中的数字。
答案 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]
整行。
虽然这种方法比在行中匹配数字或在分隔符周围分割更重,但它的优点是检查一条线是否符合预期的模式,并避免为异常条目返回不一致的结果。