Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查给定的正则表达式是否有效?_Java_Regex - Fatal编程技术网

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

Java 如何检查给定的正则表达式是否有效?,java,regex,Java,Regex,我有一个小程序,允许用户输入一些正则表达式。之后,我想检查这个输入是否是有效的正则表达式 我想知道Java中是否有内置方法,但找不到这样的jet 你能给我一些建议吗?你只需输入regex字符串,看看它是否抛出PatternSyntaxException String regex = "***"; PatternSyntaxException exc = null; try { Pattern.compile(regex); } catch (Pat

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

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

你能给我一些建议吗?

你只需输入regex字符串,看看它是否抛出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
***
^

关于长相落后 这里引用了一句老话:

有关查找的重要注意事项

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
     }
  }
 }