RegEx模式具有不寻常的unicode字符和单词边界

时间:2015-12-01 14:19:42

标签: java regex

我遇到了有关RegEx模式的问题,我希望有人能向我解释一下:

任务是匹配对象名称并将其从存储在对象的某个字段中的描述中删除。我尝试了以下表达式:

    final String description= object.getDescrition();
    final Matcher descriptionMatcher=
        Pattern.compile("\\b" + object.getName() + "\\b", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE)
            .matcher(description);

一切正常,直到代码遇到名称中添加了“注册商标”符号:String name = ObjectName®

如果我删除了最后一个单词边界,则会再次匹配。这种行为的原因是什么?如何改进此代码以找到所有这些特殊情况?

注意:商标符号通过空格与对象名称分开。

2 个答案:

答案 0 :(得分:1)

在这种情况下,请将您的模式更改为:

"\\b\\Q" + object.getName() + "\\E(?<=\\b|®)"

如果您需要处理更复杂的情况,请在外观中使用替换而不是字边界。例如:

"(?<=\\s|^)\\Q" + object.getName() + "\\E(?=\\s|$)"

"(?<=\\s|^)" + Pattern.quote(object.getName()) + "(?=\\s|$)"

答案 1 :(得分:0)

®字符不被视为单词字符,因此您的Pattern将不匹配。

一个快速而肮脏的解决方案是将它与单词边界交替,如果你只有这种情况:

Pattern.compile("\\b" + object.getName() + "\\b|®"