Javascript 使用正则表达式匹配给定字符串计算中的最后一个数学运算符
我想使用正则表达式来匹配计算字符串中的最后一个数学运算符 例如,在字符串中: “25+4-1*100/423”,它将匹配“/” 或 “25*2*4444*123+4”,它将匹配“+” 我已经尝试过正则表达式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) = ["*",
/(\-\+\\\/\*)(?=[^-\+\/\*]*$)/
,但由于某些原因,它两次匹配最后一个运算符
例如:
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)
定义了一个非捕获组(我们需要它才能在上面进行前瞻)。我明白了。感谢您的解释:)