怎么防止matcher()函数、发生PatternSyntaxException

String str ='?';
matches(str),
因为传了?导致matches()发生了PatternSyntaxException。
有什么方法能在调用matches前对str进行整形、不让异常发生呢?

不只是是针对“?”、所有有可能发生异常的表达式都要整形。有什么写法吗?
也就是说哪种表达式会发生PatternSyntaxException?

在使用matches()方法时,传入的参数会被当做正则表达式来解析。如果传入的参数不符合正则表达式的语法规则,就会导致PatternSyntaxException异常的发生。
为了避免这种情况的发生,可以使用Pattern.quote()方法来对字符串进行整形,将其转化为普通字符串。例如,可以将传入的参数str进行如下处理:

String str = "?";
String regex = Pattern.quote(str);
if (str.matches(regex)) {
  // 进行匹配操作
}

通过使用Pattern.quote()方法,可以将传入的参数str转化为普通字符串,避免了PatternSyntaxException的发生。
另外,需要注意的是,任何包含特殊字符的正则表达式都有可能导致PatternSyntaxException异常的发生。其中,特殊字符包括但不限于: \ ^ $ . | ? * + ( ) [ ] { } 。因此,在使用正则表达式时,需要对包含特殊字符的字符串进行转义处理,或者通过使用Pattern.quote()方法来对字符串进行整形,避免这种异常的发生。

这个建议你还是加上 try catch ,因为输入并不能100%控制
或者在Matches之前用 isMatch 先判断下

  • 看下这篇博客,也许你就懂了,链接:Java学习笔记——正则表达式(Pattern类、Matcher类和PatternSyntaxException)
  • 以下回答由chatgpt基于相关博客总结生成:

    如何预防matcher()函数发生PatternSyntaxException?

    问题分类

    正则表达式、异常处理

    解决方案

    1. 编写正确的正则表达式
    2. 正确的正则表达式不会导致PatternSyntaxException异常的发生,因此可以通过认真编写正则表达式来避免该异常的发生。
    3. 使用try-catch代码块捕获异常
    4. 使用try-catch代码块可以对异常进行捕获和处理,避免程序崩溃。
    5. 在catch代码块中可以输出异常信息或者使用默认方式处理异常,如给出提示信息、返回空值等。
    6. 在调用matcher()函数之前对正则表达式进行检查和处理
    7. 可以编写一个工具类,在调用matcher()函数之前检查正则表达式是否包含非法字符,若包含,则对其进行处理或者给出异常提示信息。
    8. 可以使用正则表达式的编译方法compile()对表达式进行编译和预处理,如果表达式中存在错误,则编译时会抛出异常,从而可以在调用matcher()函数之前检测表达式的正确性。

    下面给出一个对正则表达式进行检查和编译的工具类RegexUtils的示例代码:

    import java.util.regex.Pattern;
    import java.util.regex.PatternSyntaxException;
    
    public class RegexUtils {
    
        /**
         * 检查正则表达式是否包含非法字符
         *
         * @param regex 正则表达式
         * @return 是否包含非法字符
         */
        public static boolean checkRegex(String regex) {
            try {
                Pattern.compile(regex);
            } catch (PatternSyntaxException e) {
                return false;
            }
            return true;
        }
    
        /**
         * 编译正则表达式
         *
         * @param regex 正则表达式
         * @return Pattern对象,编译成功返回,编译失败返回null
         */
        public static Pattern compileRegex(String regex) {
            try {
                return Pattern.compile(regex);
            } catch (PatternSyntaxException e) {
                System.err.println("Invalid regex: " + regex);
                e.printStackTrace();
            }
            return null;
        }
    }
    

    使用方法:

    String regex = "\\d*";
    if (RegexUtils.checkRegex(regex)) {
        Pattern pattern = RegexUtils.compileRegex(regex);
        if (pattern != null) {
            Matcher matcher = pattern.matcher("123");
            // do something
        }
    } else {
        System.out.println("Invalid regex!");
    }
    

    可能导致异常的正则表达式

    1. 未结束的括号
    2. 在正则表达式中如果()或[]没有正确的结束,会导致PatternSyntaxException异常的发生。
    3. 示例:"(?i)[a-z", "["没有正确的结束,会抛出PatternSyntaxException异常。
    4. 找不到匹配的括号
    5. 在正则表达式中如果[]没有找到正确的括号匹配,会导致PatternSyntaxException异常的发生。
    6. 示例:"[a-z", 没有找到"]"会抛出PatternSyntaxException异常。
    7. 重复次数错误
    8. 在正则表达式中如果重复次数错误,例如出现了连续的 * 或 +,也会导致PatternSyntaxException异常的发生。
    9. 示例:"a**" 或 "[a-z++]"会抛出PatternSyntaxException异常。
    10. 不存在的转义字符
    11. 在正则表达式中如果使用了不存在的转义字符,会导致PatternSyntaxException异常的发生。
    12. 示例:"a\w" 会抛出PatternSyntaxException异常。

    参考资料

    • Java正则表达式教程:https://www.runoob.com/java/java-regular-expressions.html
    • Pattern类官方文档:https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html