gpt4 book ai didi

java - 正则表达式替换所有匹配项,但不替换第一个和最后一个字符

转载 作者:行者123 更新时间:2023-11-30 08:02:56 26 4
gpt4 key购买 nike

恐怕我看了一些显而易见的事情。但我想匹配和替换单词。但前提是尾部前面有一个非字母字符。喜欢匹配kaas:

<p>Kaas bla bla
bla more kaas, bla
another line adding more kaas to....

此正则表达式适用于\P{L}kaas\P{L} (kaas 是一个变量)。但是当我用 cheese 替换 kaas 时,我得到:

<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 更安全。

关于java - 正则表达式替换所有匹配项,但不替换第一个和最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31613708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com