我正在学习正则表达式,下面的代码将每隔一个空格替换为下划线,但我想要替换每三个空格。
String replace = deletedWords.replaceAll("(?<!\\G\\w+)\\s","_");
我得到的输出是:"我已经被这个问题困扰了很长时间"
我想要的输出是:"我一直卡在这个问题上"
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}
代替+
。如果您喜欢,可以使用其他限制。
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
(?:^|\\G)
,因为在字符串的开头(第一次出现)匹配到的\\G
已经匹配了字符串的开始。所以使用\\G
而不是(?:^|\\G)
将会得到相同的结果。 - Casimir et Hippolyte\G
单独就足够了。 - hwnd