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

Почему регулярные выражения не могут использовать ключевые слова вместо символов?

Хорошо, я почти не понимаю основы RegEx, но почему они не могут использовать его для использования ключевых слов (например, SQL) вместо некоторых критических подстановочных символов и символов?

Это для производительности, поскольку RegEx интерпретируется/анализируется во время выполнения? (не скомпилировано)

Или, может быть, для скорости письма? Учитывая, что, когда вы изучаете некоторые "простые" комбинации символов, становится легче вводить символ 1 вместо ключевого слова?

4b9b3361

Ответ 1

Вы действительно этого хотите?

Pattern findGamesPattern = Pattern.With.Literal(@"<div")
    .WhiteSpace.Repeat.ZeroOrMore
    .Literal(@"class=""game""").WhiteSpace.Repeat.ZeroOrMore.Literal(@"id=""")
    .NamedGroup("gameId", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal(@"-game""")
    .NamedGroup("content", Pattern.With.Anything.Repeat.Lazy.ZeroOrMore)
    .Literal(@"<!--gameStatus")
    .WhiteSpace.Repeat.ZeroOrMore.Literal("=").WhiteSpace.Repeat.ZeroOrMore
    .NamedGroup("gameState", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal("-->");

Хорошо, но это ваши похороны, человек.

Загрузите библиотеку, которая делает это здесь:
http://flimflan.com/blog/ReadableRegularExpressions.aspx

Ответ 2

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

  • каждый символ является регулярным выражением, представляющим себя
  • Если a и b являются регулярными выражениями, то a?, a|b и ab также являются регулярными выражениями
  • ...

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

grep -R 'main' *.c

Или, может быть, очень простые шаблоны:

grep -c ':-[)(]' seidl.txt

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

Ответ 3

Perl 6 делает довольно революционный шаг вперед в читаемости регулярных выражений. Рассмотрим адрес формы: 100 E Main St Springfield MA 01234

Здесь поддерживается умеренно читаемое регулярное выражение, совместимое с Perl 5, для синтаксического анализа того, что (многие угловые случаи не обрабатываются):

 m/
     ([1-9]\d*)\s+
     ((?:N|S|E|W)\s+)?
     (\w+(?:\s+\w+)*)\s+
     (ave|ln|st|rd)\s+
     ([:alpha:]+(?:\s+[:alpha:]+)*)\s+
     ([A-Z]{2})\s+
     (\d{5}(?:-\d{4})?)
  /ix;

Это регулярное выражение Perl 6 имеет такое же поведение:

grammar USMailAddress {
     rule  TOP { <addr> <city> <state> <zip> }

     rule  addr { <[1..9]>\d* <direction>?
                  <streetname> <streettype> }
     token direction { N | S | E | W }
     token streetname { \w+ [ \s+ \w+ ]* }
     token streettype {:i ave | ln | rd | st }
     token city { <alpha> [ \s+ <alpha> ]* }
     token state { <[A..Z]>**{2} }
     token zip { \d**{5} [ - \d**{4} ]? }
  }

Perl 6-грамматика - это класс, а жетоны - все вызывающие методы. Используйте его так:

if $addr ~~ m/^<USMailAddress::TOP>$/ {
     say "$<city>, $<state>";
}

Этот пример получен из talk, который я представил, в Frozen Perl 2009. Реализация Rakudo Perl 6 достаточно полная, чтобы этот пример работал сегодня.

Ответ 4

Хорошо, если бы у вас были ключевые слова, как бы вы могли легко отличить их от фактически сопоставленного текста? Как бы вы справились с пробелами?

Исходный текст Компания: A Dept.: B

Стандартное регулярное выражение:

Company:\s+(.+)\s+Dept.:\s+(.+)

Или даже:

Company: (.+) Dept. (.+)

Regex ключевого слова (очень сложно пытаться достать соломона...)

"Company:" whitespace.oneplus group(any.oneplus) whitespace.oneplus "Dept.:" whitespace.oneplus group(any.oneplus)

Или упрощено:

"Company:" space group(any.oneplus) space "Dept.:" space group(any.oneplus)

Нет, это, вероятно, не лучше.

Ответ 5

Потому что это соответствует формальной теории языка и ее математической нотации.

Ответ 6

Это ошибка Perl...!

Собственно, точнее, регулярные выражения возникают из ранней разработки Unix, и тогда более краткий синтаксис был намного более ценным. Хранение, время обработки, физические терминалы и т.д. Были очень ограниченными, в отличие от сегодняшнего дня.

История регулярных выражений в Википедии объясняет больше.

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

EDIT: Исправлено Джоном Сондерсом: Регулярные выражения были популяризированы Unix, но сначала реализованы редактором QED. Те же конструктивные ограничения применялись, тем более, к более ранним системам.

Ответ 7

На самом деле, нет, мир не начинался с Unix. Если вы прочтете статью в Википедии, вы увидите, что

В 1950-х годах математик Стивен Коул Клине описал эти модели, используя его математическую нотацию, называемую регулярными множествами. Язык SNOBOL был ранней реализацией соответствия шаблонов, но не идентичен регулярным выражениям. Кен Томпсон построил запись Kleene в редакторе QED как средство для сопоставления шаблонов в текстовых файлах. Позже он добавил эту возможность в редактор Unix ed, который в конечном итоге привел к популярному поисковому инструменту grep для использования регулярных выражений

Ответ 8

Это намного раньше, чем PERL. В статье Wikipedia о регулярных выражениях атрибуты первых реализаций регулярных выражений Кен Томпсону славы UNIX, которые внедрили их в QED, а затем ed. Я предполагаю, что команды имели короткие имена по соображениям производительности, но намного раньше, чем на стороне клиента. Освоение регулярных выражений - отличная книга о регулярных выражениях, которая предлагает возможность аннотировать регулярное выражение (с флагом /x ), чтобы сделать это легче читать и понимать.

Ответ 9

Потому что идея регулярных выражений, как и многие вещи, происходящие из UNIX, заключается в том, что они являются краткими, что способствует краткости в отношении читаемости. На самом деле это хорошо. Я закончил писать регулярные выражения (против моего лучшего суждения), которые имеют длину 15 строк. Если бы это имело подробный синтаксис, это не было бы регулярным выражением, это была бы программа.

Ответ 10

На самом деле довольно легко реализовать "текстовую" форму регулярного выражения - см. мой ответ здесь. В двух словах: напишите несколько функций, которые возвращают строки регулярных выражений (и при необходимости берут параметры).

Ответ 11

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

Я думаю, что более запутанным является то, что каждая вспомогательная библиотека создает собственный синтаксис вместо использования (или расширения) классического регулярного выражения Perl (например,\1, $1, {1},... для замещений и многих других примеров).

Ответ 12

Я знаю, что он ответил на ваш вопрос неправильно, но RegExBuddy имеет функцию, которая объясняет ваше регулярное выражение простым английским языком. Это может облегчить изучение.

Ответ 13

Если используемый вами язык поддерживает Posix regexes, вы можете их использовать.

Пример:

\d

будет таким же, как

[:digit:]

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

В таблице на странице regular-expressions.info больше примеров.

Ответ 14

По какой-то причине мой предыдущий ответ был удален. Во всяком случае, я вещь Ruby regexp машина соответствовала бы счету, http://www.rubyregexp.sf.net. Это мой собственный проект, но я думаю, что он должен работать.