pra*_*nth 5 javascript regex string jquery match
我有一个等式:+8x2+10y2-99+5=99.我需要单独的数值而不混合字母字符.我使用正则表达式str.match(/[0-9]/g)来获取所有数值,但对于上面的等式,结果应该是-99,5,99.
您可以使用可选的连字符和单词边界来仅匹配给定表达式中的数字:
var str = '+8x2+10y2-99+5=99';
var matches = str.match(/-?\b\d+\b/g);
document.writeln('<pre>' + matches.join(',') + '</pre>');Run Code Online (Sandbox Code Playgroud)
输出:
-99,5,99
Run Code Online (Sandbox Code Playgroud)
借鉴您原来的方法,我们可以构建一个可靠的解决方案,并了解一些其他正则表达式功能的工作原理。
首先,让我们添加对分隔字母的支持。这可以通过使用元字符来完成,元字符仅在单词字符和非单词字符(或单词字符与输入文本的开头或结尾)之间的过渡点处\b提供虚拟匹配。构成单词字符的定义在正则表达式实现之间有所不同,但通常与字符类类似[a-zA-Z0-9_];检查您的语言参考文档以获取详细信息。
var results = '+8x2+10y2-99+5=99'.match(/\b[0-9]+\b/g);
document.writeln('<pre>' + results.join(',') + '</pre>');Run Code Online (Sandbox Code Playgroud)
这会产生以下输出,该输出非常接近,但无法拾取“-”:
99,5,99
Run Code Online (Sandbox Code Playgroud)
下一站:获得破折号。这只是单个字符的更改,我们在 [0-9] 字符类的末尾添加了“-”字符。'-' 在字符类中具有特殊的权力,这需要转义 '-' 或使用特殊规则,即它在字符类末尾没有权力;没必要的时候我不喜欢逃避,所以最后还是逃了。现在举个例子:
还有中提琴!结果已经出来了,而且效果很好:
-99,5,99
Run Code Online (Sandbox Code Playgroud)
但是,我们可以改进这个正则表达式。第一个改进是使用\d元字符来替换字符类中太长的 0-9 范围。使用此技术可以节省 33.333% 的按键输入量,并且会给您的朋友、同事和各地的正则表达式专家留下深刻的印象:
var results = '+8x2+10y2-99+5=99'.match(/\b[0-9-]+\b/g);
document.writeln('<pre>' + results.join(',') + '</pre>');Run Code Online (Sandbox Code Playgroud)
只是检查了一下,是的,我们得到了相同的结果:
-99,5,99
Run Code Online (Sandbox Code Playgroud)
最后,我们将解决我们在向后几步添加“-”支持时产生的一个小问题。问题是这种方法实际上可能会导致一些错误(或不正确)的匹配结果。
例如,当输入包含一个有效数字减去另一个有效数字时,以前的解决方案会将它们作为一个结果返回。我们将对此进行测试,然后将“-”分隔开,仅将其作为有效数字的前缀进行匹配。为了测试这一点,我们必须稍微改变输入(将“10y2”更改为“10”),然后测试以前的(“坏”)和新的(“好”)解决方案:
由此得出的结果是:
Bad: 10-99,5,99
Good: 10,-99,5,99
Run Code Online (Sandbox Code Playgroud)
显然,这是一个更好的方法。这样,我们就有了最终的解决方案。保持健康并明智地使用正则表达式!