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

时间:2015-07-24 14:55:26

标签: java regex

我害怕看到明显的东西。但我想匹配和替换单词。但只有当有一个非字母字符时,才会在尾部进行。喜欢匹配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的原因是这也适用于我需要的非西方语言。

1 个答案:

答案 0 :(得分:1)

你可以在这里使用lookarounds进行零宽度断言:

(?<!\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用于用户提供的输入更安全。