Как проверить, является ли строка регулярным выражением или нет - PullRequest
12 голосов
/ 14 июня 2011

У меня есть строка. Как я могу проверить, является ли строка регулярным выражением или содержит регулярное выражение или это нормальная строка?

Ответы [ 5 ]

17 голосов
/ 14 июня 2011

Единственная надежная проверка, которую вы можете сделать, - это если String является синтаксически правильным регулярным выражением:

boolean isRegex;
try {
  Pattern.compile(input);
  isRegex = true;
} catch (PatternSyntaxException e) {
  isRegex = false;
}

Обратите внимание, однако, что это приведет к true даже для таких строк, как Hello World и I'm not a regex, потому что технически они являются допустимыми регулярными выражениями.

Единственными случаями, когда возвращается false, являются строки, которые не являются правильными регулярными выражениями, например [unclosed character class или (unclosed group или +.

4 голосов
/ 14 июня 2011

Это некрасиво, но обнаружит простые регулярные выражения (с оговоркой, что они должны быть разработаны для Java, т.е. иметь соответствующий символ обратной косой черты).

public boolean isRegex(final String str) {
    try {
        java.util.regex.Pattern.compile(str);
        return true;
    } catch (java.util.regex.PatternSyntaxException e) {
        return false;
    }
}
1 голос
/ 14 июня 2011

Может быть, вы попытаетесь скомпилировать это регулярное выражение, используя пакет регулярных выражений из Apache (http://jakarta.apache.org/regexp/), и, если вы получите исключение, то это недопустимое регулярное выражение, поэтому вы скажете, что это обычная строка.1003 *

boolean validRE = true;
try {
    RE re = new RE(stringToCheck);
} catch (RESyntaxException e) {
    validRE = false;
}

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

1 голос
/ 14 июня 2011

нет разницы между «нормальным» укусом и регулярным выражением.Регулярное выражение - это просто обычная строка, которая используется в качестве шаблона для сопоставления вхождений шаблона в другой строке.

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

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

Например, «бла» - это регулярное выражение, которое будет соответствовать строке «бла» только там, где она встречается в другой строке.

При рассмотренииТаким образом, вы можете видеть, что регулярное выражение не должно содержать никаких «специальных символов», которые выполняют более сложное сопоставление с образцом, и оно будет соответствовать только строке в образце

0 голосов
/ 06 июля 2012
/**
 * If input string is a regex, matches will always return a false.
 */ 
public boolean isRegex(final String str) {   
    return str != null ? !str.matches(str) : false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...