恐怕我看了一些明显的东西。但是我想匹配并替换单词。但是,只有在存在非字母字符的情况下,两个字符都在拖尾之前。像匹配kaas
:
<p>Kaas bla bla
bla more kaas, bla
another line adding more kaas to....
此正则表达式适用\ P {L} kaas \ P {L}(kaas是变量)。但是,当我用
kaas
替换cheese
时,我得到:<pcheesebla bla
bla morecheese bla
another line adding morecheeseto....
现在我可以做:
final String nonChar = "\\P{L}";
final String dutchWord = "kaas";
final String englishWord = "cheese";
final String text = getText();
final Pattern p = Pattern.compile(nonChar + dutchWord + nonChar);
final Matcher match = p.matcher(text);
while (match.find()) {
final int start = match.start();
final int end = match.end();
final String c1 = Character.toString(text.charAt(start));
final String c2 = Character.toString(text.charAt(end - 1));
final String result = match.replaceFirst(c1 + englishWord + c2);
//final String result = match.replaceAll(c1 + englishWord + c2);// not a `c1` and `c2` are equal
}
只能用一次,因为我无法从
Matcher
中获取正确的信息来弄清楚kaas
的前后字符。我很确定我在向前和向后的正则表达式字符上都看到了一些东西-我认为。我尝试使用?:
,但我一直得到PatternSyntaxException
。我需要添加什么来解决此问题?以及如何使用Java。为此,我使用
P{L}
而不是*w
类型的字符是否有所不同?注意:我使用
P
的原因是,这对于非西方语言也应该有效。 最佳答案
您可以在此处对零宽度断言使用环视:
(?<!\p{L})kaas(?!\p{L})
这只会断言
kaas
之前或之后没有另一个unicode字母。在Java中它将是:
final Pattern p = Pattern.compile("(?<!\\p{L})" + Pattern.quote(dutchWord) + "(?!\\p{L})",
Pattern.CASE_INSENSITIVE);
PS:将
Pattern.quote
用于用户提供的输入更为安全。