如何检查给定的正则表达式是否有效?

新手上路,请多包涵

我有一个小程序允许用户输入一些正则表达式。之后我想检查这个输入是否是一个 有效 的正则表达式。

我想知道 Java 中是否有内置方法,但找不到这样的 jet。

你能给我一些建议吗?

原文由 Philipp Andre 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 549
2 个回答

这是一个例子。

 import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class RegexTester {
    public static void main(String[] arguments) {
        String userInputPattern = arguments[0];
        try {
            Pattern.compile(userInputPattern);
        } catch (PatternSyntaxException exception) {
            System.err.println(exception.getDescription());
            System.exit(1);
        }
        System.out.println("Syntax is ok.");
    }
}

java RegexTester "(capture" 然后输出 "Unclosed group" ,例如。

原文由 laz 发布,翻译遵循 CC BY-SA 3.0 许可协议

你可以只 Pattern.compile 正则表达式字符串,看看它是否 throws PatternSyntaxException

     String regex = "***";
    PatternSyntaxException exc = null;
    try {
        Pattern.compile(regex);
    } catch (PatternSyntaxException e) {
        exc = e;
    }
    if (exc != null) {
        exc.printStackTrace();
    } else {
        System.out.println("Regex ok!");
    }

这一个特别产生以下输出:

 java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
***
^


关于回顾

这是来自旧的可信赖的 regular-expressions.info 的引述:

关于 Lookbehind 的重要说明

Java 通过允许有限重复使事情更进一步。您仍然不能使用星号或加号,但可以使用问号和花括号并指定最大参数。 Java 认识到有限重复可以重写为具有 不同但固定长度 的字符串的交替。

我认为该短语包含错字,应该说“不同但长度有限”。无论如何,Java 似乎确实允许在回顾中交替使用不同的长度。

     System.out.println(
        java.util.Arrays.toString(
            "abracadabra".split("(?<=a|ab)")
        )
    ); // prints "[a, b, ra, ca, da, b, ra]"

还有一个错误,您实际上可以在其中进行无限长度的回顾 _并使其正常工作_,但我不会依赖这种行为。

     System.out.println(
        "1234".replaceAll(".(?<=(^.*))", "$1!")
    ); // prints "1!12!123!1234!"

原文由 polygenelubricants 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题