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

3

我正在学习正则表达式,下面的代码将每隔一个空格替换为下划线,但我想要替换每三个空格。

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

我得到的输出是:"我已经被这个问题困扰了很长时间"

我想要的输出是:"我一直卡在这个问题上"

2个回答

3
你可以在正向后瞻中使用“最后匹配或行开头”技巧:
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}代替+。如果您喜欢,可以使用其他限制。

演示。

注意:对于固定限制,存在一种解决方法。请参见此演示hwnd提供。


谢谢,这个有效。你有什么推荐学习正则表达式的教程吗? - Jimmy22
@Jimmy22 这是我在网上找到的最完整的一个:链接。每当我忘记正则表达式语法的某个元素时,我都会参考它。 - Sergey Kalinichenko
不需要写 (?:^|\\G),因为在字符串的开头(第一次出现)匹配到的 \\G 已经匹配了字符串的开始。所以使用 \\G 而不是 (?:^|\\G) 将会得到相同的结果。 - Casimir et Hippolyte
@CasimiretHippolyte 是的,我尝试了几种不同的可能性,?<=\G 也可以。 - Jimmy22
@CasimiretHippolyte 实际上,我想有时在交替使用锚点的时候会变成一种习惯,但是是的,\G单独就足够了。 - hwnd

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接