如何在javascript中使用正则表达式来匹配数字和符号?
假设我有一个字符串,如下所示:如何在javascript中使用正则表达式来匹配数字和符号?,javascript,regex,match,Javascript,Regex,Match,假设我有一个字符串,如下所示: var str = "23*45+ 4*12" 如何使用regex返回 ["23","*","45","+","4","*","12"] 你会怎么做,包括小数和负数以及 var str1 = "45.3*23+(-4*5.8) 结果应该如下所示: ["45.3","*","23","+","-4","*","5.8"] 请解释你的答案,因为我对regex是新手。谢谢 解决特定问题最简单的方法是在单词边界上拆分: $ node > "23*45+ 4*
var str = "23*45+ 4*12"
如何使用regex返回
["23","*","45","+","4","*","12"]
你会怎么做,包括小数和负数以及
var str1 = "45.3*23+(-4*5.8)
结果应该如下所示:
["45.3","*","23","+","-4","*","5.8"]
请解释你的答案,因为我对regex是新手。谢谢 解决特定问题最简单的方法是在单词边界上拆分:
$ node
> "23*45+ 4*12".split(/\b/)
[ '23', '*', '45', '+ ', '4', '*', '12' ]
描述了正则表达式/\b/
既然有了空格,您可能应该修剪每个结果:
$ node
> "23*45+ 4*12".split(/\b/).map(function (s) {return s.trim()})
[ '23', '*', '45', '+', '4', '*', '12' ]
现在,如果您只想捕获数字和算术运算符,您可能应该直接匹配它们,而不是依赖于拆分。匹配整数的正则表达式是
\d+
哪个是一个或多个数字,与运算符匹配的正则表达式是
[=+/*]
注意,我把短线放在第一位,因为如果在中间,它将是一个字符范围(如<代码> [AZ] < /代码>,它匹配26个字符,而<代码> [-AZ] 只匹配三个字符。现在您可以执行以下操作:
$ node
> "23*45+ 4*12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
g
是正则表达式的修饰符,表示获取所有匹配项(g
代表“全局”)。最后一种方法的一个有趣之处是,它将跳过不属于的字符,因此可能会发生这种情况:
$ node
> "23 * blah45 + 4*~~~~12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
现在让我们假设您想要添加浮点数。这些看起来像22.807
,即数字,然后是点,然后是更多的数字。点在正则表达式中是特殊的,所以我们必须这样编写:\。
。因此,要捕获可以是整数或浮点值的内容,我们将编写:
\d+(\.d+)?
-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?
其中,?
表示可选。现在我们还可以添加一个前导可选负号:
-?\d+(\.\d+)?
正如您从编程中了解到的,我们喜欢编写像255.84E-19
这样的数字,这使我们能够:
-?\d+(\.\d+([Ee][+-]?\d+)?)?
具有可选的指数部分,包含大写或小写E,然后是可选符号,然后是所需的指数数
还有一个问题是括号在“非捕获”上下文中存在性能问题(这里很难解释),因此专业人士会写道:
\d+(\.d+)?
-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?
在它所有的荣耀中,你得到了
$ node
> "23 * -99.45 + 4.2E7 * -12".match(/-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?|[-+*/]/g)
[ '23', '*', '-99.45', '+', '4.2E7', '*', '-12' ]
这里发生了很多事情。很抱歉,我这么深陷其中
顺便说一句,解析算术表达式并验证它们的一般问题无论如何都不能由正则表达式来完成,但希望这个解释能让您开始。解决特定问题最简单的方法是在单词边界上进行拆分:
$ node
> "23*45+ 4*12".split(/\b/)
[ '23', '*', '45', '+ ', '4', '*', '12' ]
描述了正则表达式/\b/
既然有了空格,您可能应该修剪每个结果:
$ node
> "23*45+ 4*12".split(/\b/).map(function (s) {return s.trim()})
[ '23', '*', '45', '+', '4', '*', '12' ]
现在,如果您只想捕获数字和算术运算符,您可能应该直接匹配它们,而不是依赖于拆分。匹配整数的正则表达式是
\d+
哪个是一个或多个数字,与运算符匹配的正则表达式是
[=+/*]
注意,我把短线放在第一位,因为如果在中间,它将是一个字符范围(如<代码> [AZ] < /代码>,它匹配26个字符,而<代码> [-AZ] 只匹配三个字符。现在您可以执行以下操作:
$ node
> "23*45+ 4*12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
g
是正则表达式的修饰符,表示获取所有匹配项(g
代表“全局”)。最后一种方法的一个有趣之处是,它将跳过不属于的字符,因此可能会发生这种情况:
$ node
> "23 * blah45 + 4*~~~~12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
现在让我们假设您想要添加浮点数。这些看起来像22.807
,即数字,然后是点,然后是更多的数字。点在正则表达式中是特殊的,所以我们必须这样编写:\。
。因此,要捕获可以是整数或浮点值的内容,我们将编写:
\d+(\.d+)?
-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?
其中,?
表示可选。现在我们还可以添加一个前导可选负号:
-?\d+(\.\d+)?
正如您从编程中了解到的,我们喜欢编写像255.84E-19
这样的数字,这使我们能够:
-?\d+(\.\d+([Ee][+-]?\d+)?)?
具有可选的指数部分,包含大写或小写E,然后是可选符号,然后是所需的指数数
还有一个问题是括号在“非捕获”上下文中存在性能问题(这里很难解释),因此专业人士会写道:
\d+(\.d+)?
-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?
在它所有的荣耀中,你得到了
$ node
> "23 * -99.45 + 4.2E7 * -12".match(/-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?|[-+*/]/g)
[ '23', '*', '-99.45', '+', '4.2E7', '*', '-12' ]
这里发生了很多事情。很抱歉,我这么深陷其中
顺便说一句,解析算术表达式并验证它们的一般问题无论如何都不能由正则表达式来完成,但希望这个解释能让您开始。解决特定问题最简单的方法是在单词边界上进行拆分:
$ node
> "23*45+ 4*12".split(/\b/)
[ '23', '*', '45', '+ ', '4', '*', '12' ]
描述了正则表达式/\b/
既然有了空格,您可能应该修剪每个结果:
$ node
> "23*45+ 4*12".split(/\b/).map(function (s) {return s.trim()})
[ '23', '*', '45', '+', '4', '*', '12' ]
现在,如果您只想捕获数字和算术运算符,您可能应该直接匹配它们,而不是依赖于拆分。匹配整数的正则表达式是
\d+
哪个是一个或多个数字,与运算符匹配的正则表达式是
[=+/*]
注意,我把短线放在第一位,因为如果在中间,它将是一个字符范围(如<代码> [AZ] < /代码>,它匹配26个字符,而<代码> [-AZ] 只匹配三个字符。现在您可以执行以下操作:
$ node
> "23*45+ 4*12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
g
是正则表达式的修饰符,表示获取所有匹配项(g
代表“全局”)。最后一种方法的一个有趣之处是,它将跳过不属于的字符,因此可能会发生这种情况:
$ node
> "23 * blah45 + 4*~~~~12".match(/[-+/*]|\d+/g)
[ '23', '*', '45', '+', '4', '*', '12' ]
现在让我们假设您想要添加浮点数。这些看起来像22.807
,即数字,然后是点,然后是更多的数字。点在正则表达式中是特殊的,所以我们必须这样编写:\。
。因此,要捕获可以是整数或浮点值的内容,我们将编写:
\d+(\.d+)?
-?\d+(?:\.\d+(?:[Ee][+-]?\d+)?)?
其中,?
表示可选。现在我们还可以添加一个前导可选负号:
-?\d+(\.\d+)?
正如您从编程中了解到的,我们喜欢编写像255.84E-19
这样的数字,这使我们能够:
-?\d+(\.\d+([Ee][+-]?\d+)?)?
具有可选的指数部分,包含上限或