Java 如何检查给定的正则表达式是否有效?
我有一个小程序,允许用户输入一些正则表达式。之后,我想检查这个输入是否是有效的正则表达式 我想知道Java中是否有内置方法,但找不到这样的jet 你能给我一些建议吗?你只需输入regex字符串,看看它是否抛出PatternSyntaxExceptionJava 如何检查给定的正则表达式是否有效?,java,regex,Java,Regex,我有一个小程序,允许用户输入一些正则表达式。之后,我想检查这个输入是否是有效的正则表达式 我想知道Java中是否有内置方法,但找不到这样的jet 你能给我一些建议吗?你只需输入regex字符串,看看它是否抛出PatternSyntaxException String regex = "***"; PatternSyntaxException exc = null; try { Pattern.compile(regex); } catch (Pat
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
***
^
关于长相落后 这里引用了一句老话: 有关查找的重要注意事项 Java允许有限的重复,使事情更进一步。仍然不能使用星号或加号,但可以使用问号和大括号,并指定max参数。Java认识到这样一个事实:有限重复可以重写为具有不同但固定长度的字符串的交替 我认为这个短语包含一个拼写错误,可能应该说“不同,但长度有限”。无论如何,Java似乎允许在Lookback中交替使用不同的长度
System.out.println(
java.util.Arrays.toString(
"abracadabra".split("(?<=a|ab)")
)
); // prints "[a, b, ra, ca, da, b, ra]"
System.out.println(
java.util.Arrays.toString(
“abracadabra”。拆分((?这里是一个示例
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 regextest”(捕获“
然后输出“未关闭的组”
。最明显的做法是在java.util.regex.Pattern和catch中使用compile方法
PatternSyntaxException
String myRegEx;
...
...
Pattern p = Pattern.compile(myRegEx);
如果myRegEx无效,这将抛出一个PatternSyntaxException
。new String()。匹配项(regEx)可以直接与try catch一起使用,以确定regEx是否有效
public class Solution
{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int testCases = Integer.parseInt(in.nextLine());
while(testCases>0){
String pattern = in.nextLine();
try
{
Pattern.compile(pattern);
}
catch(Exception e)
{
// System.out.println(e.toString());
System.out.println("Invalid");
}
System.out.println("Valid");
}
}
}
boolean isValidRegEx = true;
try {
new String().matches(regEx);
} catch(PatternSyntaxException e) {
isValidRegEx = false;
}
试试这个:
import java.util.Scanner;
import java.util.regex.*;
public class Solution
{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int testCases = Integer.parseInt(in.nextLine());
while(testCases>0){
String pattern = in.nextLine();
if(pattern != null && !pattern.equals("")){
try{
Pattern.compile(pattern);
System.out.println("Valid");
}catch(PatternSyntaxException e){
System.out.println("Invalid");
}
}
testCases--;
//Write your code
}
}
}
使用输入测试:
3
([A-Z])(.+)
[AZa-z
巴特卡特帕特(nat为什么不在try/catch中实例化呢?这可能是一个非常无知的问题,我只知道目前为止我所需要的正则表达式,但是创建一个无效的正则表达式不是很难吗?我说的不是一个错误的正则表达式,而是一个实际抛出错误的正则表达式?如果有人有一个例子,我希望得到一些启示here@Nick领巾:“)“
,”],,“}”
,“?”,,“*”
,“+”
,所有这些显然都是无效的(不匹配且悬空的元字符)。还有类似于“x{5,-3}“
。很多模式都是无效的。@Polygene润滑剂-啊,这很有意义,谢谢!@Philipp-这是一个无效的正则表达式,还是只是找不到任何有用的东西,但在技术上是正确的?在这里的测试中,它似乎是有效的,即使不是特别有用,我是否遗漏了一些东西?“向前看”应该是正确的术语;)Jap正是我要找的。谢谢!我很惊讶,我的不同查找长度的示例通过了这个测试。java regex引擎现在能够处理这个问题了吗?!@Philipp:添加了关于lookbehinds的内容。查看第二个示例=)我也在正则表达式.info上查找。发现得好!不,这不是打字错误。他在说每一个(理论)alternative有一个固定的长度。如果它们不固定,你就无法确定哪一个是最长的。jap,我在讨论顶部的某个地方的评论中的示例是错误的。Polygene润滑油绝对明白了这一点!java允许不同的长度,但在lookforward/LookBack中不允许使用星号或加号。他的代码检查ple也适用于我!由于缺少测试用例--;,它只运行一次,所以在代码中不使用whilechange testCases值,就像这个测试用例一样--在catch块之后,请参阅我的答案betterIt由于缺少测试用例--;,只运行一次,所以在代码中不使用while
boolean isValidRegEx = true;
try {
new String().matches(regEx);
} catch(PatternSyntaxException e) {
isValidRegEx = false;
}
import java.util.Scanner;
import java.util.regex.*;
public class Solution
{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int testCases = Integer.parseInt(in.nextLine());
while(testCases>0){
String pattern = in.nextLine();
if(pattern != null && !pattern.equals("")){
try{
Pattern.compile(pattern);
System.out.println("Valid");
}catch(PatternSyntaxException e){
System.out.println("Invalid");
}
}
testCases--;
//Write your code
}
}
}