在字符串中替换除一个字符外的所有字符的正则表达式

4

我需要一个正则表达式来替换字符串中除第一个字符外的所有匹配字符。

例如:

如果使用 'A' 进行匹配并替换为 'B'

  • 'AAA' 应替换为 'ABB'

  • 'AAA AAA' 应替换为 'ABB ABB'

如果使用空格进行匹配并替换为 'X'

  • '[空格][空格][空格]A[空格][空格][空格]' 应替换为 '[空格]XXA[空格]XX'

字符串的第一个字符,还是第一个匹配的字符? - jcaron
@jcaron 是的,序列中第一个匹配的字符 - Ammar
2个回答

5
你需要使用以下正则表达式进行替换:

\\BA

演示效果

  • \B(用于单词字符之间)断言当前位置不是单词边界\b
  • A 匹配字面上的字符 A

Java 代码:

String repl = input.replaceAll("\\BA", "B");

更新 对于您问题的第二部分,请使用以下正则表达式进行替换:

"(?<!^|\\w) "

代码:

String repl = input.replaceAll("(?<!^|\\w) ", "X");

演示2


除了空格之外,大多数情况下都可以正常工作。有什么建议吗? - Ammar
给我一个它不能正常工作的示例值,我会进行微调。 - anubhava
“' ABC '” 应该被替换为 “--ABC --”,这似乎是全新的需求。您能澄清一下吗? - anubhava
对的,但是用连字符替换空格甚至在最初的几次编辑中都没有出现,还是我错过了? - anubhava
@anubhava 您是正确的。起初,我没有明确地提到序列中的空格。 - Ammar
显示剩余4条评论

4

附注:添加了解释和演示。 :) - zx81
我修改了正则表达式、演示和解释,请看一下,Ammar。 :) - zx81
@AvinashRaj 是的,那也可以。但我真的喜欢把回顾视为“真实的人”,你知道我的意思吗?给它一些实质,就像我们之前提到的这个 C# 正则表达式。 - zx81
Ammar,如果你想要更多的规则,例如在几个空格之后发生... 你只需要不断改变简单的lookbehind,并在需要时添加ORs。例如,(?<!^|[ ]*) 如果第一个 A 前可以有多个空格,而 (?<!^|[ ]*|[@_]) 如果你也不想替换 @_ 后面的第一个 A ... 这是一种非常灵活的方法,你可以不断扩展它。 - zx81

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