Java替换String中的每个第N个特定字符(例如空格)

时间:2015-06-07 00:43:57

标签: java regex string replace

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

  // No need for the type aliases to be redefined on each function call
  type Node = Tuple2[_, List[Any]]
  type Leaf = Tuple2[Int, Int]

  def leafSum(lst: List[Any]): Int = {
     lst.foldLeft(0) {
       case (sum, x: List[_]) => sum + leafSum(x)
       case (a: Int, b: Int) => a + b
     }
  }

实施例。输出我得到了:"我已经__ stucken_on this_problem forever"

实施例。输出我想要的:"我已经永远停留在this_problem"

2 个答案:

答案 0 :(得分:3)

你可以使用"最后一场比赛或第一线#34;积极投资的技巧:

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 demo查看hwnd

答案 1 :(得分: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