Javascript 使用正则表达式匹配给定字符串计算中的最后一个数学运算符

Javascript 使用正则表达式匹配给定字符串计算中的最后一个数学运算符,javascript,regex,Javascript,Regex,我想使用正则表达式来匹配计算字符串中的最后一个数学运算符 例如,在字符串中: “25+4-1*100/423”,它将匹配“/” 或 “25*2*4444*123+4”,它将匹配“+” 我已经尝试过正则表达式/(\-\+\\\/\*)(?=[^-\+\/\*]*$)/,但由于某些原因,它两次匹配最后一个运算符 例如: var str = "25+4-1*3" var regex = /(\-|\+|\/|\*)(?=[^\-\+\/\*]*$)/ str.match(regex) = ["*",

我想使用正则表达式来匹配计算字符串中的最后一个数学运算符

例如,在字符串中:

“25+4-1*100/423”,它将匹配“/”

“25*2*4444*123+4”,它将匹配“+”

我已经尝试过正则表达式
/(\-\+\\\/\*)(?=[^-\+\/\*]*$)/
,但由于某些原因,它两次匹配最后一个运算符

例如:

var str = "25+4-1*3" 
var regex = /(\-|\+|\/|\*)(?=[^\-\+\/\*]*$)/
str.match(regex) = ["*", "*"]
但出于某种原因,它两次匹配最后一个操作符两次

var str=“25+4-1*3”
当我键入
str.match(regex)
时,我得到
[“*”,“*”]

RegExp#exec
String#match
都返回一个结果数组,其中整体匹配(对于整个表达式)作为第一个条目,然后任何捕获组的值作为后续条目。由于您有一个捕获组,这意味着您可以在第一和第二位置看到操作员

只需删除捕获组(使其成为非捕获组),因为除lookahead之外的整个表达式都是捕获组:

var regex=/(?:\-\+\\\/\*)(?=[^-\+\/\*]*$)/;
//^^^^^^^^^^^^^^----非捕获组
var str=“25+4-1*3”
console.log(str.match(regex))您的正则表达式工作得非常好。匹配字符串时,只需添加一个全局(
g
)标志

var str=“25+4-1*3”;
var result=str.match(/(\-\+\\/\*)(?=[^\-\+\/\*]*$)/g);

控制台日志(结果)
你的正则表达式。是什么让你认为它两次匹配?
var str=“25+4-1*3”
当我键入
str.match(正则表达式)
时,我得到
[“*”,“*”]
添加
g
只会隐藏真正的问题,即捕获组。它可以与
匹配
;对于
exec
,这可能是个问题。我猜您指的是
(\-\124;\+\ 124;\/\*)
?有什么问题吗?@JosephLiu:正如我在回答(和评论)中所说的,这就是为什么你从
match
中得到两个数组条目的原因。添加
g
标志是一种解决方法,而不是一种解决方案。此外,还可以使用字符来完成。类
[+\-*\/]
,不带
g
标志感谢您详细解释,但对我来说仍然没有意义!对不起,正则表达式对我来说是完全陌生的@JosephLiu:假设我们有
/[a-z]{3}([a-z]{3})/
,这是一个表达式,表示“匹配任意六个字符a-z,并将最后三个字符放入一个捕获组”。如果您这样做
“123foobar456”。匹配(/[a-z]{3}([a-z]{3})/)
您将看到
[“foobar”,“bar”]
:第一个条目是匹配整个表达式的内容(
“foobar”)
);第二个条目仅与捕获组匹配(
“bar”
)。在您原来的正则表达式中,所有匹配的(非前瞻性)部分都在捕获组中,因此您在数组的第一个和第二个条目中看到了相同的情况。因此,弧形括号
()
使其成为捕获组?@JosephLiu:
(某物)
定义了捕获组,是的<代码>(?:something)
定义了一个非捕获组(我们需要它才能在上面进行前瞻)。我明白了。感谢您的解释:)