我正在尝试学习正则表达式,下面的代码用下划线替换每个其他空格,但我试图替换每隔三个空格。
// 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"
答案 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}
代替+
。如果您愿意,可以使用其他限制。
答案 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