【问题标题】:How to use Matcher to properly replace all occurences of a pattern inside a string如何使用 Matcher 正确替换字符串中所有出现的模式
【发布时间】:2012-02-16 02:53:00
【问题描述】:

我正在使用 Matcher 在包含文本的 String 中查找特定模式。
正则表达式检查各种模式,例如为简单起见:
\\bword1\\b|(\\b(?:word2(?:(\\s+)word3)?)?)

无论如何我都能在字符串中找到模式。
到目前为止还可以。

我想要的是能够使用Matcher.replaceAll 来替换找到的每个模式,使用相同的模式,但添加了一些内容。

例如

如果匹配器在某处找到word1,我想将其替换为{v}word1{v}

最好如何做到这一点?我尝试添加匹配器在列表中找到的组,然后遍历输入字符串以替换所有组,但显然这不起作用。

更新:
我可以匹配我需要的条款,@Luis 正则表达式进行替换,但我需要替换我的字符串中的 all
通过循环并在字符串中执行正则表达式"pattern", "{v}$0{v}"),我打破了我之前所做的事情。我需要以某种方式在 replaceAll 中包含一个否定的lookbehind,以便了解一个术语何时已被替换

更新:
使用@Luis 正则表达式和负向查看它的工作原理

【问题讨论】:

    标签: java regex string replace


    【解决方案1】:

    更新:

    "pattern".replaceAll("pattern", "{v}$0{v}"))

    我已经对此进行了测试,它会根据需要返回“{v}pattern{v}”。

    【讨论】:

    • 我会给你一个 +1 但这并不能解决我的问题。当我为找到的每个术语循环执行 replaceAll 时,我会破坏以前的修改,因为我可以匹配 word1 word2 及更高版本在字符串word2 中,第二个replaceAll 打破了之前找到的word1 word2
    • 我想我需要在你的陈述中以某种方式消极看待
    • 您最初的问题并不清楚。我怀疑您最好的选择可能不是对每个术语都进行 replaceAll - 在这种情况下,几乎不可能避免您描述的问题 - 而是修改您的原始模式以匹配每个单独的模式。
    • 不知道你的意思。我的原始模式确实与个别术语匹配。我的问题在于它们的替换。我想我不关注你。
    • 您应该只进行一次 replaceAll 调用,并且您应该尝试一次替换所有单个术语:例如"(?:word1 word2)|(?:word2)" 而不是 "word1 word2" 然后是 "word2"。如果这不起作用——也许你每次都需要做不同的事情——那么这将成为一个更难的问题。
    猜你喜欢
    • 2012-05-20
    • 2021-10-23
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2011-02-23
    • 2011-12-19
    • 2013-03-25
    相关资源
    最近更新 更多