JavaScript 正则表达式替换字符串中的最后一个模式?

标签 javascript regex

我有一个看起来像这样的字符串

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 之后的所有内容。还尝试在 $ 之前加一个问号以使该组不贪婪。

我希望能够轻松做到这一点,并且使用 bamramBam 我认为正则表达式将是最简单的解决方案,但我认为我错了。

我哪里出错了?

最佳答案

您可以使用以下正则表达式:

(?!.*\)\.)(\.(?:bam|ramBam)\(.*\))$

Demo

(?!.*\)\.)         # 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/

相关文章:

javascript - 添加 JQuery "Read More"脚本而不剥离 HTML 标签

javascript - 在 JavaScript 中用字符串调用类

regex - 在 ReplaceAllStringFunc 回调中获取组值

c# - 基于模式的更智能的字符串替换

regex - 在 makefile 中用 sed 匹配并替换字符串

javascript - 如何在内联CSS中使用jquery变量

javascript - 在javascript中创建数组并在闭包内附加值

javascript - WinJS自定义控件: winControl undefined

regex - 未封闭的正则表达式

regex - 强制解析可选组