恐怕我看了一些明显的东西。但是我想匹配并替换单词。但是,只有在存在非字母字符的情况下,两个字符都在拖尾之前。像匹配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用于用户提供的输入更为安全。

09-25 15:48