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

Это происходит потому, что вы определяете рекомендуемые задачи вне функции Task, которая срабатывает одновременно с console.log (), которая принимает первое доступное значение [], попробуйте вместо этого.

 Task.find({}).stream()
   .on('data', function(task){ 
     let recommendedTasks = [];
     for(let skill of member.skills){ 
      for(let skill2 of task.skills){  
       if(String(skill) == String(skill2)) return recommendedTasks.push(task._id); 
      } 
     } 
   }); 
   console.log(recommendedTasks)

Надеюсь, это поможет.

11
задан Chad Birch 3 April 2009 в 21:45
поделиться

13 ответов

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

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

34
ответ дан 3 December 2019 в 00:38
поделиться

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

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

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

grep -R 'main' *.c

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

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

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

10
ответ дан 3 December 2019 в 00:38
поделиться

Ну, если бы у Вас были ключевые слова, как Вы легко дифференцировали бы их от на самом деле подобранного текста? Как Вы обработали бы пробел?

Компания исходного текста: Отдел: B

Стандарт regex:

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

Или даже:

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

Ключевое слово regex (попытка действительно трудно не получают strawman...),

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

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

7
ответ дан 3 December 2019 в 00:38
поделиться

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

5
ответ дан 3 December 2019 в 00:38
поделиться

Perl 6 делает довольно революционный шаг вперед в regex удобочитаемости. Рассмотрите адрес формы: E Main St, 100, Спрингфилд Массачусетс 01234

Вот является умеренно читаемый Perl 5 совместимым regex для парсинга этого (много угловых случаев, не обработанных):

 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 regex имеет то же поведение:

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 является классом, и маркеры являются всеми invokable методами. Используйте его как это:

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

Этот пример прибывает из разговора, который я представил на Замороженном семинаре Perl 2009 года. Внедрение Rakudo Perl 6 достаточно полно, что этот пример работает сегодня.

8
ответ дан 3 December 2019 в 00:38
поделиться

Это - отказ Perl...!

На самом деле, более конкретно, Регулярные выражения прибывают из ранней разработки Unix, и краткий синтаксис был намного более высоко оценен затем. Устройство хранения данных, время обработки, физические терминалы, и т.д. было все очень ограничено, скорее в отличие от этого, сегодня.

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

Существуют альтернативы Regex, но я не уверен, что любой действительно уловил смысл.

Править: Исправленный John Saunders: Регулярные выражения были популяризированы Unix, но сначала реализованы ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ редактор. Те же примененные конструктивные ограничения, еще больше, к более ранним системам.

4
ответ дан 3 December 2019 в 00:38
поделиться

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

1
ответ дан 3 December 2019 в 00:38
поделиться

На самом деле, нет, мир не начался с Unix. При чтении статьи Wikipedia Вы будете видеть это

В 1950-х математик Stephen Cole Kleene описал эти модели с помощью своей математической нотации, названной регулярными наборами. Язык SNOBOL был ранней реализацией сопоставления с образцом, но не идентичный регулярным выражениям. Ken Thompson встроил нотацию Kleene в редактора QED как средство соответствовать шаблонам в текстовых файлах. Он позже добавил эту возможность к редактору Unix редактор, который в конечном счете привел к популярному использованию grep's средства поиска регулярных выражений

3
ответ дан 3 December 2019 в 00:38
поделиться

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

1
ответ дан 3 December 2019 в 00:38
поделиться

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

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

1
ответ дан 3 December 2019 в 00:38
поделиться

Это намного ранее, чем Perl. Статья в Википедии о Регулярных выражениях приписывает первые реализации регулярных выражений Ken Thompson известности UNIX, который реализовал их во ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ и затем редактор редактора. Я предполагаю, что команды имели краткие названия по причинам производительности, но очень перед стать клиентским. Освоение Регулярных выражений является замечательной книгой о регулярных выражениях, которая предлагает опцию аннотировать регулярное выражение (флагом/x), чтобы помочь читать и понять.

2
ответ дан 3 December 2019 в 00:38
поделиться

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

Пример:

\d

совпал бы с

[:digit:]

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

Существует больше примеров в таблице на регулярной-expressions.info's странице.

1
ответ дан 3 December 2019 в 00:38
поделиться

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

1
ответ дан 3 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: