【问题标题】:Using regex to replace only the last occurrence of a pattern with JS使用正则表达式仅用 JS 替换模式的最后一次出现
【发布时间】:2011-06-12 07:05:22
【问题描述】:

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

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")

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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    试试

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

    否定的前瞻断言确保文本中没有进一步的bbb:[^:]+ 周围的括号是不必要的。

    说明:

    (?!       # 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
    

    [\s\S] 解决方法是必要的,因为 JavaScript 没有允许点匹配换行符的选项。

    【讨论】:

    • 我喜欢这样的回答:stackoverflow.com/questions/843049/… 前面加 (.*) 尽量在匹配前吃光。
    • @PeterEhrlich:你必须改用[\s\S]*(点与换行符不匹配),我通常更喜欢明确使用像.*这样的非特定正则表达式,但是是的,那也可以。它的性能会比我的更好还是更差取决于它所使用的实际文本。我怀疑由于.* 导致的所有回溯,大文本的情况会更糟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多