说我有一个如下字符串:
var str = "23*45+ 4*12"
如何使用正则表达式返回
["23","*","45","+","4","*","12"]
你会如何包含小数和负数呢?
var str1 = "45.3*23+(-4*5.8)
结果应如下所示:
["45.3","*","23","+","-4","*","5.8"]
请解释我的回答,因为我是regex的新手。谢谢!
答案 0 :(得分:3)
解决特定问题的最简单方法是拆分字边界:
$ node
> "23*45+ 4*12".split(/\b/)
[ '23', '*', '45', '+ ', '4', '*', '12' ]
正则表达式/\b/
描述为here。
既然你有空格,你应该修剪每个结果:
$ node
> "23*45+ 4*12".split(/\b/).map(function (s) {return s.trim()})
[ '23', '*', '45', '+', '4', '*', '12' ]
现在,如果您只想捕获数字和算术运算符,您应该直接匹配它们而不是依赖于拆分。匹配整数的正则表达式是
\d+
是一个或多个数字,匹配运算符的正则表达式是
[=+/*]
请注意,我首先放置短划线,因为如果它位于中间,则它将是一个字符范围(如[a-z]
匹配26个字符,而[-az]
仅匹配三个)。现在你可以这样做:
$ node
> "23*45+ 4*12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
g
是正则表达式的修饰符,表示get all 匹配(g
代表“global”)。关于最后一种方法的一个有趣的事情是它会跳过不属于的字符,所以这可能发生:
$ node
> "23 * blah45 + 4*~~~~12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
现在让我们假设你想添加浮点数。那些看起来像22.807
,即数字,然后是点,然后是更多的数字。点在regex中是特殊的,所以我们必须这样写:\.
。因此,为了捕获可以是整数或浮点值的东西,我们会写:
\d+(\.d+)?
其中?
表示可选。现在我们还可以添加一个主要的可选负号:
-?\d+(\.\d+)?
正如您从编程中所知,我们希望编写像255.84E-19
这样的数字,这些数字可以让我们:
-?\d+(\.\d+([Ee][+-]?\d+)?)?
带有可选指数部分的,包含大写或小写E,然后是可选符号,然后是必需的指数。
然后关于括号在“非捕获”上下文中存在性能问题的事情(这里很难解释),所以专业人士会写:
-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?
并且在它的所有荣耀中你得到了
$ node
> "23 * -99.45 + 4.2E7 * -12".match(/-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?|[-+*/]/g)
[ '23', '*', '-99.45', '+', '4.2E7', '*', '-12' ]
这里有很多事情要发生。很抱歉深入了解它。
顺便说一下,解析算术表达式和验证它们的一般问题无论如何都不能通过正则表达式完成,但希望这个解释能让你开始。