使用正则表达式匹配每个单词中第一个出现的字母

时间:2015-04-10 23:10:12

标签: java regex

我试图用“ee”替换单词开头以外的单词中第一次出现的“I”。我正在使用java。

这应该改变短语

INFINITY IS GIANT.

要:

INFeeNITY IS GeeANT.

到目前为止,我的代码已经过多次修改。一个是:

replaceAll("(?<=[^I*])\\BI", "ee");

我认为这是使用lookbehind。非常感谢帮助!感谢。

2 个答案:

答案 0 :(得分:2)

正如您在OP \\BI中所述,发现第一个I字符不在单词的开头 - 如果正则表达式匹配单词的其余部分,则使用{{1} }或(?:\\B.)*,然后它就不会匹配同一个单词中的第二个.*?\\b

I

两者都会导致:

"INFINITY IS GIANT".replaceAll( "\\BI((?:\\B.)*)", "ee$1");
"INFINITY IS GIANT".replaceAll( "\\BI(.*?\\b)", "ee$1");

如果你在文本中有重音符号,它甚至可以工作:

INFeeNITY IS GeeANT

两个输出:

"IŇFINIŦŶ IS ĞIANŤ".replaceAll( "\\BI((?:\\B.)*)", "ee$1");
"IŇFINIŦŶ IS ĞIANŤ".replaceAll( "\\BI(.*?\\b)", "ee$1");

<强>替代地

使用IŇFeeNIŦŶ IS ĞeeANŤ 可以从单词的开头到第一个\\b(.(?:\\B.)*?)\\BI匹配:

I

输出:

"INFINITY IS GIANT".replaceAll( "\\b(.(?:\\B.)*?)\\BI", "$1ee");

答案 1 :(得分:0)

如果您不关心重音字母,这种模式就可以解决问题:

\b([a-zA-Z][a-hj-zA-HJ-Z]*)[iI]

将其替换为$1ee

Demo

它匹配单词的第一个字母(\b[a-zA-Z]),然后匹配除I[a-hj-zA-HJ-Z]*)之外的任何字母,然后I

如果你必须处理重音字母,那么模式必须有所改变:

(?<!\p{L})(\p{L}(?:(?![iI])\p{L})*)[iI]

Demo

在这里,我使用\p{L}表示任何Unicode字母,但必须写(?![iI])\p{L}来表示I之外的任何Unicode字母。我还将\b替换为(?<!\p{L}),以确保我获得Unicode支持。