Подтвердить что ты не робот

Как проверить, действительно ли данное Regex?

У меня есть небольшая программа, позволяющая пользователям вводить некоторые регулярные выражения. впоследствии мне нравится проверять, является ли этот ввод регулярным выражением действительным или нет.

Мне интересно, есть ли встроенный метод в Java, но не смог найти такой самолет.

Можете ли вы дать мне совет?

4b9b3361

Ответ 1

Вот пример.

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", например.

Ответ 2

Вы можете просто 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
***
^

Что касается lookbehinds

Здесь цитата из старого надежного regular-expressions.info:

Важные замечания о Lookbehind

Java делает шаг вперед, позволяя конечное повторение. Вы по-прежнему не можете использовать звезду или плюс, но вы можете использовать знак вопроса и фигурные скобки с указанным максимальным параметром. Java признает тот факт, что конечное повторение может быть переписано как чередование строк с разными, но фиксированными длинами.

Я думаю, что фраза содержит опечатку и, вероятно, должна сказать "разные, но конечные длины". В любом случае, Java, похоже, допускает чередование разных длин в lookbehind.

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

Там также есть ошибка, в которой вы действительно можете иметь бесконечную длину lookbehind и иметь ее работу, но я не буду полагаться на такое поведение.

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

Ответ 3

Наиболее очевидной задачей было бы использовать метод компиляции в java.util.regex.Pattern и catch PatternSyntaxException

String myRegEx;
...
...
Pattern p = Pattern.compile(myRegEx);

Это вызовет PatternSyntaxException, если myRegEx недействителен.

Ответ 4

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);
                System.out.println("Valid");
            }catch(PatternSyntaxException exception){
                System.out.println("Invalid");
            }

        }
    }
}

Ответ 5

 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");
    }
 }
}

Ответ 6

new String(). match (regEx) можно напрямую использовать с try-catch, чтобы определить, действительно ли regEx допустимо.

boolean isValidRegEx = true;
try {
    new String().matches(regEx);
} catch(PatternSyntaxException e) {
    isValidRegEx = false;
}

Ответ 7

попробуйте это:

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
batcatpat (физ