【问题标题】:Java replace every Nth specific character (e.g. space) in StringJava 替换字符串中的每 N 个特定字符(例如空格)
【发布时间】:2015-08-21 17:27:02
【问题描述】:

我正在尝试学习正则表达式,下面的代码用下划线替换所有其他空格,但我正在尝试替换每三个空格。

 String replace = deletedWords.replaceAll("(?<!\\G\\w+)\\s","_");

例如。我得到的输出:“我已经_一直被困在这个_问题上”

例如。我想要的输出:“我一直被困在这个问题上”

【问题讨论】:

    标签: java regex string replace


    【解决方案1】:

    您可以在积极的后视中使用“最后匹配或行首”技巧:

    String s = "I have been stuck on this problem forever quick brown fox jumps over";
    String r = s.replaceAll("(?<=(^|\\G)\\S{0,100}\\s\\S{0,100}\\s\\S{0,100})\\s", "_");
    System.out.println(r);
    

    使用后视的不幸后果是您需要为匹配提供最大长度。我用{0,100} 代替*{1,100} 代替+。如果您愿意,可以使用其他限制。

    Demo.

    注意:存在固定限制的解决方法。见this demohwnd

    【讨论】:

    • 感谢这工作。有什么学习正则表达式的教程可以推荐吗?
    • @Jimmy22 这是我在网上找到的最完整的一个:link。每当我忘记正则表达式语法的元素时,我都会参考它。
    • 不需要写(?:^|\\G),因为开头(第一次出现)的\\G与字符串的开头匹配。所以\\G 而不是(?:^|\\G) 将给出相同的结果。
    • @CasimiretHippolyte 是的,我尝试了几种不同的可能性?
    • @CasimiretHippolyte 确实,我认为交替使用锚点有时会成为一种习惯,但是是的,您只需要 \G
    【解决方案2】:

    你可以用这个:

    String z = "I have been stuck on this problem forever quick brown fox jumps over";
    String p = z.replaceAll("(\\s+\\S+\\s+\\S+)\\s+", "$1_");
    System.out.println(p);
    

    由于字符串是从左到右解析的,并且由于字符(包括前两个空格)都被消耗掉了,所以不需要测试连续性,所以最后一个\\s+的位置总是3的倍数。

    第 n 个字符的更一般的模式是:

    ((?:target all_that_is_not_the_target){n-1}) target
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2015-10-01
      • 2014-01-12
      • 2016-11-20
      相关资源
      最近更新 更多