【问题标题】:how can I replace substring that occurs only once while excluding substring two or more times in a row?如何替换仅出现一次的子字符串,同时连续两次或多次排除子字符串?
【发布时间】:2015-12-23 16:26:31
【问题描述】:

有什么方法可以在 java 中执行以下操作?

String s = "acdaaefacaa";
String b = s.replaceLikeMethod("a", "");

和 b 变成“cdaaefcaa”。基本上将第一个字符串"a" 的任何出现替换为另一个"",除非"a" 连续出现两次或更多次。

【问题讨论】:

  • 我怀疑您需要使用正则表达式,但我在该主题上的经验不足,无法给出足够的答案。
  • 刚刚修改了case来清除任何歧义,我想替换只发生一次的“a”,如果有两个或多个连续的“aa”,忽略它。
  • @javarookie 试图让问题更清楚。如果您不同意,请随时回滚
  • s.replaceAll("(?<!a)a(?!a)", "")? ideone.com/V8aYjy
  • @zapl 我在写答案时根本没有注意 cmets。如果 zapl 发布他自己的答案,我将删除我的答案

标签: java string replace


【解决方案1】:

您可以使用正则表达式来实现这一点。你想要的功能是

  1. Negative LookBehind (?<!foo) 匹配模式,除非 foo 出现在之前。
  2. 负前瞻。 (?!foo) 匹配模式,除非 foo 紧随其后

你基本上需要同时使用这两个字符串作为要匹配和模式的字符串。例如

String pattern = "(?<!foo)foo(?!foo)";

或者轻松替换为运行时已知的字符串,例如"a"

String pattern = "(?<!foo)foo(?!foo)".replace("foo", "a");

最后,替换只是做:

String b = s.replaceAll(pattern, "");

【讨论】:

    【解决方案2】:

    使用这个正则表达式:((?&lt;!a)a(?!a))。它使用负前瞻和后瞻。它匹配每个 a 之前和之后没有另一个 a

    测试:

    String input = "acdaaefacaa";
    String output = input.replaceAll("((?<!a)a(?!a))", "");
    System.out.println(output);
    

    输出:

    caaefcaa

    【讨论】:

    • 很好奇,有什么理由将整个模式放在(额外的)括号中?那有什么效果?
    • @ManosNikolaidis 效果没什么,根本没什么。
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 2020-05-22
    • 2016-12-03
    • 2011-12-01
    • 2016-05-07
    • 2017-04-16
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多