使用正则表达式仅用JS替换最后一次出现的模式

时间:2011-01-20 07:58:38

标签: javascript regex

我有一个案例,我试图用另一个模式替换某个模式。我的问题是我只需要替换该模式的最后一次出现,而不是全部。我发现了这个问题:

How to replace last occurrence of characters in a string using javascript

但它不符合我的需要。作为背景,我会说我正在尝试替换CSS规则,但是对于当前示例,我们来看看这个文本:

abcd:bka:

bbb:aad:

accx:aaa:

bbb:a0d:

cczc:aaa:

假设我只想替换bbb的值。我现在的规则是

text.replace(/(\s*bbb:)([^:]+)/,"$1aaa")

但它只会取代第一场比赛,而我希望它取代最后一场比赛。 我目前的模式实际上比这个更复杂,但我认为伪问题就足够了。

1 个答案:

答案 0 :(得分:8)

尝试

text.replace(/(\s*bbb:)(?![\s\S]*bbb:)[^:]+/,"$1aaa")

负前瞻断言确保文本中没有前面的bbb:。 <{1}}周围的括号是不必要的。

<强>解释

[^:]+

(?! # Assert that it is impossible to match the following after the current position: [\s\S]* # any number of characters including newlines bbb: # the literal text bbb: ) # End of lookahead assertion 解决方法是必要的,因为JavaScript没有允许点匹配换行符的选项。