我有一个小程序,允许用户输入一些正则表达式.之后我想检查这个输入是否是有效的正则表达式.
我想知道Java中是否有内置方法,但是找不到这样的喷气机.
你能给我一些建议吗?
这是一个例子.
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似乎都允许在后视中交替使用不同的长度.
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!"