我有一个看起来像这样的字符串
var std = new Bammer({mode:"deg"}).bam(0, 112).bam(177.58, (line-4)/2).bam(0, -42)
.ramBam(8.1, 0).bam(8.1, (slot_height-thick)/2)
我想在最后一个 .bam()
或 .ramBam()
周围放置一个标签。
str.replace(/(\.(ram)?bam\(.*?\))$/i, '<span class="focus">$1</span>');
我希望得到:
new Bammer({mode:"deg"}).bam(0, 112).bam(177.58, (line-4)/2).bam(0, -42).ramBam(8.1, 0)<span class="focus">.bam(8.1, (slot_height-thick)/2)</span>
但不知何故,我继续与非贪婪参数作斗争,它用 span 标签包装了 new Bammer 之后的所有内容。还尝试在 $
之前加一个问号以使该组不贪婪。
我希望能够轻松做到这一点,并且使用 bam
或 ramBam
我认为正则表达式将是最简单的解决方案,但我认为我错了。
我哪里出错了?
最佳答案
您可以使用以下正则表达式:
(?!.*\)\.)(\.(?:bam|ramBam)\(.*\))$
(?!.*\)\.) # do not match ').' later in the string
( # begin capture group 1
.\ # match '.'
(?:bam|ramBam) # match 'bam' or 'ramBam' in non-cap group
\(.*\) # match '(', 0+ chars, ')'
) # end capture group 1
$ # match end of line
对于问题中给出的示例,否定先行 (?!.*\)\.)
将内部指针移动到子字符串之前:
.bam(8.1, (slot_height-thick)/2)
因为这是字符串中第一个没有子字符串 ).
的位置。
如果没有行尾 anchor $
并且字符串结束:
...0).bam(8.1, (slot_height-thick)/2)abc
那么仍然会进行替换,产生一个以以下结尾的字符串:
...0)<span class="focus">.bam(8.1, (slot_height-thick)/2)</span>abc
如果字符串不以预期捕获组的内容结尾,则包含行尾 anchor 可以防止替换。
关于JavaScript 正则表达式替换字符串中的最后一个模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60625719/