regex Java正则表达式,CASE_INSENSITIVE,字母加全字

jgovgodb  于 2023-01-21  发布在  Java
关注(0)|答案(1)|浏览(109)

我正在尝试删除/替换字符串中的整个单词。
我想这样做的大小写敏感,它也应该为特殊字符,如.\/工作。
要做到这一点,我使用以下代码:

String result = Pattern.compile(stringToReplace, Pattern.LITERAL | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE).matcher(inputString)
                    .replaceAll("");

像这样,它可以处理特殊字符,并且不区分大小写。
我知道可以通过使用“\b”启用全字匹配。
我可以这样做:

String result = Pattern.compile("\\b"+stringToReplace+"\\b",  Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE).matcher(inputString)
                    .replaceAll("");

这样它只匹配整个单词,但是对于特殊字符会有问题。它会干扰Pattern. LITERAL。我需要禁用它,这是不希望的。
如何将Pattern.LITERAL与全字匹配结合使用?

yv5phkfx

yv5phkfx1#

您必须记住,\b word boundary pattern是上下文相关的,并且匹配字符串的开始/结束和单词字符之间,或者匹配单词和非单词字符之间。
你需要使用

String result = Pattern.compile("(?!\\B\\w)"+Pattern.quote(stringToReplace)+"(?<!\\w\\B)",  Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE).matcher(inputString)
                    .replaceAll("");

主要有两个变化:

  • stringToReplace需要为Pattern.quote d,以确保所有特殊字符都被转义
  • Adaptive word boundaries将确保仅在必要时(即,当相邻字符是字字符时)才需要字边界。(?!\B\w)是左手自适应字边界,而(?<!\w\B)是右手自适应字边界。实际上,由于零宽度Assert和字边界模式的性质,看起来两者可以互换地使用,但是从逻辑的观点来看,这种表示法是最好的。

相关问题