Существует ли регулярное выражение для определения правильного регулярного выражения?

Можно ли обнаружить правильное регулярное выражение с другим регулярным выражением? Если да, пожалуйста, приведи пример кода ниже.

8 Solutions collect form web for “Существует ли регулярное выражение для определения правильного регулярного выражения?”

/ ^ # start of string ( # first group start (?: (?:[^?+*{}()[\]\\|]+ # literals and ^, $ | \\. # escaped characters | \[ (?: \^?\\. | \^[^\\] | [^\\^] ) # character classes (?: [^\]\\]+ | \\. )* \] | \( (?:\?[:=!]|\?< [=!]|\?>)? (?1)?? \) # parenthesis, with recursive content | \(\? (?:R|[+-]?\d+) \) # recursive matching ) (?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )? # quantifiers | \| # alternative )* # repeat content ) # end first group $ # end of string / 

Это рекурсивное регулярное выражение и не поддерживается многими механизмами регулярных выражений. Основанные на PCRE должны его поддерживать.

Без пробелов и комментариев:

 /^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?< [=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$/ 

.NET не поддерживает рекурсию напрямую. (Конструкции (?1) и (?R) .) Рекурсия должна быть преобразована в подсчет сбалансированных групп:

 ^ # start of string (?: (?: [^?+*{}()[\]\\|]+ # literals and ^, $ | \\. # escaped characters | \[ (?: \^?\\. | \^[^\\] | [^\\^] ) # character classes (?: [^\]\\]+ | \\. )* \] | \( (?:\?[:=!] | \?< [=!] | \?> | \?< [^\W\d]\w*> | \?'[^\W\d]\w*' )? # opening of group (?) # increment counter | \) # closing of group (?< -N>) # decrement counter ) (?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )? # quantifiers | \| # alternative )* # repeat content $ # end of string (?(N)(?!)) # fail if counter is non-zero. 

Уплотненный:

 ^(?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?< [=!]|\?>|\?< [^\W\d]\w*>|\?'[^\W\d]\w*')?(?)|\)(?< -N>))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*$(?(N)(?!)) 

Вряд ли.

Оцените его в try..catch или независимо от того, что предоставляет ваш язык.

Нет, если вы строго говорите о регулярных выражениях и не включаете некоторые реализации регулярных выражений, которые на самом деле являются контекстно-свободными грамматиками.

Существует одно ограничение регулярных выражений, которое делает невозможным запись регулярного выражения, которое соответствует всем и только регулярным выражениям. Вы не можете сопоставлять реализации, например, фигурные скобки. Regexes использует много таких конструкций, поэтому возьмем [] в качестве примера. Всякий раз, когда есть [должно быть соответствие]. Достаточно просто для регулярного выражения «[. *]».

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

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

EDIT: Закончил запись в блоге об этом: Ограничения регулярного выражения

Хороший вопрос. Истинные регулярные языки не могут решить произвольно глубоко вложенные хорошо сформированные круглые скобки. То есть, если ваш алфавит содержит ‘(‘ и ‘)’, цель состоит в том, чтобы решить, имеет ли строка из них хорошо сформированные соответствующие скобки. Поскольку это необходимое требование для регулярных выражений, ответ отрицательный.

Однако: если вы отмените требование и добавите рекурсию, вы, вероятно, сможете это сделать. Причина в том, что recursion может действовать как «стек», позволяя вам «подсчитать» текущую глубину вложенности, нажав на этот стек.

Russ Cox написал замечательный трактат по внедрению регулярных выражений : регулярное соответствие выражений может быть простым и быстрым

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

Язык, который определяет правильные регулярные выражения, на самом деле является контекстно-свободной грамматикой, и для его обработки вы должны использовать соответствующий синтаксический анализатор. Ниже приведен пример университетского проекта для синтаксического анализа простых регулярных выражений (без большинства конструкций). Он использует JavaCC. И да, комментарии написаны на испанском языке, хотя имена методов довольно понятны.

 SKIP : { " " | "\r" | "\t" | "\n" } TOKEN : { < DIGITO: ["0" - "9"] > | < MAYUSCULA: ["A" - "Z"] > | < MINUSCULA: ["a" - "z"] > | < LAMBDA: "LAMBDA" > | < VACIO: "VACIO" > } IRegularExpression Expression() : { IRegularExpression r; } { r=Alternation() { return r; } } // Matchea disyunciones: ER | ER IRegularExpression Alternation() : { IRegularExpression r1 = null, r2 = null; } { r1=Concatenation() ( "|" r2=Alternation() )? { if (r2 == null) { return r1; } else { return createAlternation(r1,r2); } } } // Matchea concatenaciones: ER.ER IRegularExpression Concatenation() : { IRegularExpression r1 = null, r2 = null; } { r1=Repetition() ( "." r2=Repetition() { r1 = createConcatenation(r1,r2); } )* { return r1; } } // Matchea repeticiones: ER* IRegularExpression Repetition() : { IRegularExpression r; } { r=Atom() ( "*" { r = createRepetition(r); } )* { return r; } } // Matchea regex atomicas: (ER), Terminal, Vacio, Lambda IRegularExpression Atom() : { String t; IRegularExpression r; } { ( "(" r=Expression() ")" {return r;}) | t=Terminal() { return createTerminal(t); } |  { return createLambda(); } |  { return createEmpty(); } } // Matchea un terminal (digito o minuscula) y devuelve su valor String Terminal() : { Token t; } { ( t= | t= ) { return t.image; } } 

Вы можете отправить регулярное выражение в preg_match, которое вернет false, если регулярное выражение недействительно. Не забудьте использовать «@» для подавления сообщений об ошибках:

 @preg_match($regexToTest, ''); 
  • вернет 1, если регулярное выражение «//».
  • будет возвращать 0, если регулярное выражение в порядке.
  • в противном случае вернет false.

Этот пример на вики-странице pyparsing дает грамматику для синтаксического анализа некоторых регулярных выражений с целью возвращения набора совпадающих строк. Таким образом, он отвергает те re, которые include неограниченные термины повторения, такие как «+» и «*». Но это должно дать вам представление о том, как структурировать парсер, который будет обрабатывать re.

Попробуй это…

 //regular expression for email var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; if(pattern.test(email)){ return true; } else { return false; } 
  • Как сопоставить любой символ в нескольких строках в регулярном выражении?
  • Генератор случайных текстов на основе регулярных выражений
  • Regex до тех пор, пока не включится
  • Регулярное выражение для пропуска символа в группе захвата
  • Объединить Regexp?
  • Поддержка \ K в regex
  • Регулярное выражение
  • Регулярное выражение для строки, содержащей одно слово, но не другое
  • Разница между * и + регулярным выражением
  • Почему регулярные выражения настолько противоречивы?
  • Мое регулярное выражение слишком много. Как я могу сказать, что он соответствует наименьшему возможному шаблону?
  • Interesting Posts

    Как ограничить загрузку трафика в Firefox

    Мое приложение «содержит шифрование»?

    Список полезных настроек среды в Java

    Как исправить профили bluetooth HSP / HFP на Linux?

    Как найти расширение файла?

    Не удалось подключиться к FTP-сайтам даже при отключенном брандмауэре Windows

    Ajax / jQuery – загрузить содержимое веб-страницы в div на загрузку страницы?

    Lazy Загрузка изображений в Listview в Android (уровень начального уровня)?

    Создайте архив из каталога без добавления имени каталога в архив

    Заблокированный Chrome по доверенности компании

    Практическое решение для распознавания текста для преобразования большой книги в цифровой формат?

    Звук ТВ-тюнера воспроизводит громкоговорители, но не может его записать

    Добавление настраиваемого текста в поле перекрестной ссылки Word

    Есть ли какой-либо API для интеграции сервера обмена Microsoft с Java-приложением для синхронизации задач?

    Чтение двухстрочных заголовков в R

    Давайте будем гением компьютера.