包含特殊字符的Pattern.compile字符串

时间:2013-06-05 19:24:27

标签: java regex

我有一个简单的方法来搜索和编译给定字符串的模式

    String search = I GIVE IT SOME STRING;
    String trimmedSearch = search.trim();
    if (trimmedSearch.isEmpty())
    {
        pattern_ = null;
    }
    else if (trimmedSearch.contains("*") || trimmedSearch.contains("(") 
        || trimmedSearch.contains(")") || trimmedSearch.contains("?")
        || trimmedSearch.contains(".") || trimmedSearch.contains("[")
        || trimmedSearch.contains("]") || trimmedSearch.contains("{")
        || trimmedSearch.contains("}") || trimmedSearch.contains("^")
        || trimmedSearch.contains("|") || trimmedSearch.contains("$")
        || trimmedSearch.contains("+") || trimmedSearch.contains("\\"))
    {
        pattern_ = null;
    }
    else
    {
        pattern_ = Pattern.compile(trimmedSearch.toUpperCase(), Pattern.CASE_INSENSITIVE);
    }

只要搜索*

,模式就会崩溃

因为我有一个可怕的巨大的if语句检查,以确保该字符串不包含任何可以崩溃它的字符。但是,如果我想将它们包含在搜索中,该怎么办呢?有什么办法吗?

任何帮助都将受到赞赏,在网上任何地方都很难找到这类问题或问题,我开始失去理智。

2 个答案:

答案 0 :(得分:5)

使用Pattern.quote()。它从输入中引用所有正则表达式元字符。

如果此方法的结果与原始方法不同,您知道输入中至少有一个正则表达式字符:

pattern_ = trimmedSearch.equals(Pattern.quote(trimmedSearch))
    ? Pattern.compile(trimmedSearch.toUpperCase(), Pattern.CASE_INSENSITIVE)
    : null;

答案 1 :(得分:1)

你可以像这样转义字符串中的特殊字符

trimmedSearch = Pattern.quote(trimmedSearch);

请参阅How to escape text for regular expression in Java