Как проверить, действительно ли данное Regex?
У меня есть небольшая программа, позволяющая пользователям вводить некоторые регулярные выражения. впоследствии мне нравится проверять, является ли этот ввод регулярным выражением действительным или нет.
Мне интересно, есть ли встроенный метод в Java, но не смог найти такой самолет.
Можете ли вы дать мне совет?
Ответы
Ответ 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 (физ