如何检查给定的正则表达式是否有效?
我有一个小程序,允许用户输入一些正则表达式。之后,我想检查此输入是否是有效的正则表达式。
我想知道Java中是否有内置方法,但找不到这样的jet。
你能给我一些建议吗?
我有一个小程序,允许用户输入一些正则表达式。之后,我想检查此输入是否是有效的正则表达式。
我想知道Java中是否有内置方法,但找不到这样的jet。
你能给我一些建议吗?
下面是一个示例。
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"
你可以只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通过允许有限重复更进一步。您仍然不能使用星号或加号,但可以使用问号和大括号以及指定的 max 参数。Java认识到这样一个事实,即有限重复可以重写为具有不同但固定长度的字符串的交替。
我认为这句话包含一个错别字,可能应该说“不同,但长度有限”。无论如何,Java似乎确实允许在lookbehind中交替使用不同的长度。
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!"