使用String的replaceAll方法删除所有标记,除非它们遵循特定的短语

时间:2012-12-02 00:53:14

标签: java regex

我需要用另一个令牌替换特定令牌(在本例中为?)(我们可以从!或其他东西开始)。 String的replaceAll方法适用于此。但是,如果碰巧跟随令牌action,我不想替换问号。 (那太糟糕了!)

我已经尝试了text = text.replaceAll("[^a][^c][^t][^i][^o][^n]\\?","!");但是没有用。

例如,我希望"test.action?param=lol?omg";变成test.action?param=lol!omg。我知道我可以做一些愚蠢的事情

text.replaceAll("action\\?","%%%CRAZYTOKEN%%%")
    .replaceAll("\\?","!")
    .replaceAll("%%%CRAZYTOKEN%%%","action?");

但这似乎是浪费时间,特别是在大字符串上。我宁愿做对。

2 个答案:

答案 0 :(得分:2)

你需要背后的负面看法

text.replaceAll("(?<!action)\\?", "!");

这声称? 跟随action

答案 1 :(得分:2)

只需使用zero-width negative lookbehind assertion仅匹配关注?的{​​{1}}:

action

请注意text = text.replaceAll("(?<!action)\\?", "!"); 之前的额外\\。您需要转义?,因为它是正则表达式中的特殊字符。