【发布时间】:2015-08-21 17:27:02
【问题描述】:
我正在尝试学习正则表达式,下面的代码用下划线替换所有其他空格,但我正在尝试替换每三个空格。
String replace = deletedWords.replaceAll("(?<!\\G\\w+)\\s","_");
例如。我得到的输出:“我已经_一直被困在这个_问题上”
例如。我想要的输出:“我一直被困在这个问题上”
【问题讨论】:
我正在尝试学习正则表达式,下面的代码用下划线替换所有其他空格,但我正在尝试替换每三个空格。
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} 代替+。如果您愿意,可以使用其他限制。
【讨论】:
(?:^|\\G),因为开头(第一次出现)的\\G与字符串的开头匹配。所以\\G 而不是(?:^|\\G) 将给出相同的结果。
\G。
你可以用这个:
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
【讨论】: