我有一个看起来像的字符串
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>
但不知何故,我继续与非贪婪参数作斗争,它用跨度标签包装了新 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)
因为这是字符串中).
后面没有子字符串的第一个位置。
如果没有行尾锚点$
并且字符串结束:
...0).bam(8.1, (slot_height-thick)/2)abc
然后仍然会进行替换,从而产生一个以字符串结尾的字符串:
...0)<span class="focus">.bam(8.1, (slot_height-thick)/2)</span>abc
如果字符串不以预期捕获组的内容结尾,则包含行尾锚点可防止替换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句