Это происходит потому, что вы определяете рекомендуемые задачи вне функции 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)
Надеюсь, это поможет.
Вы действительно хотите это?
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
Регулярные выражения имеют математическое (на самом деле, теория языка) фон и кодируются несколько как математическая формула. Можно определить их рядом правил, например
a
и b
регулярные выражения, затем a?
, a|b
и ab
регулярные выражения, такжеИспользуя основанный на ключевом слове язык была бы большая нагрузка для простых регулярных выражений. Большую часть времени Вы будете просто использовать простую текстовую строку в качестве шаблона поиска:
grep -R 'main' *.c
Или возможно очень простые шаблоны:
grep -c ':-[)(]' seidl.txt
После того как Вы привыкаете к регулярным выражениям, этот синтаксис очень ясен и точен. В более сложных ситуациях Вы будете, вероятно, использовать что-то еще, так как большое регулярное выражение очевидно трудно считать.
Ну, если бы у Вас были ключевые слова, как Вы легко дифференцировали бы их от на самом деле подобранного текста? Как Вы обработали бы пробел?
Компания исходного текста: Отдел: 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)
Нет, это, вероятно, не лучше.
Поскольку это соответствует теории формальных языков, и это - математическая нотация.
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 достаточно полно, что этот пример работает сегодня.
Это - отказ Perl...!
На самом деле, более конкретно, Регулярные выражения прибывают из ранней разработки Unix, и краткий синтаксис был намного более высоко оценен затем. Устройство хранения данных, время обработки, физические терминалы, и т.д. было все очень ограничено, скорее в отличие от этого, сегодня.
История Регулярных выражений на Википедию объясняет больше.
Существуют альтернативы Regex, но я не уверен, что любой действительно уловил смысл.
Править: Исправленный John Saunders: Регулярные выражения были популяризированы Unix, но сначала реализованы ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ редактор. Те же примененные конструктивные ограничения, еще больше, к более ранним системам.
Поскольку идея регулярных выражений - как много вещей, которые происходят из UNIX - состоит в том, что они являются краткими, одобряя краткость по удобочитаемости. Это - на самом деле хорошая вещь. Я закончил тем, что писал регулярные выражения (против моего лучшего решения), которые являются 15 строками долго. Если бы это имело подробный синтаксис, то это не был бы regex, это была бы программа.
На самом деле, нет, мир не начался с Unix. При чтении статьи Wikipedia Вы будете видеть это
В 1950-х математик Stephen Cole Kleene описал эти модели с помощью своей математической нотации, названной регулярными наборами. Язык SNOBOL был ранней реализацией сопоставления с образцом, но не идентичный регулярным выражениям. Ken Thompson встроил нотацию Kleene в редактора QED как средство соответствовать шаблонам в текстовых файлах. Он позже добавил эту возможность к редактору Unix редактор, который в конечном счете привел к популярному использованию grep's средства поиска регулярных выражений
На самом деле довольно легко реализовать "более многословную" форму regex - см. мой ответ здесь. Вкратце: запишите горстку функций, которые возвращают строки regex (и берут параметры при необходимости).
Я не думаю, что ключевые слова принесли бы любую пользу. Регулярные выражения как таковые сложны, но также и очень мощны.
То, что я думаю, более сбивает с толку, то, что каждая библиотека поддержки изобретает свой собственный синтаксис вместо того, чтобы использовать (или расшириться) классический Perl regex (например, \1, 1$, {1}... для замен и значительно большего количества примеров).
Это намного ранее, чем Perl. Статья в Википедии о Регулярных выражениях приписывает первые реализации регулярных выражений Ken Thompson известности UNIX, который реализовал их во ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ и затем редактор редактора. Я предполагаю, что команды имели краткие названия по причинам производительности, но очень перед стать клиентским. Освоение Регулярных выражений является замечательной книгой о регулярных выражениях, которая предлагает опцию аннотировать регулярное выражение (флагом/x), чтобы помочь читать и понять.
Если язык, который Вы используете, поддерживает Posix regexes, можно использовать их.
Пример:
\d
совпал бы с
[:digit:]
Нотация скобки является намного более четкой на том, чему она соответствует. Я все еще изучил бы "загадочные подстановочные символы и символы, так как Вы будете все еще видеть их в чужом коде и должны понять их.
Существует больше примеров в таблице на регулярной-expressions.info's странице.
Я знаю его ответ на Ваш вопрос неправильный путь вокруг, но RegExBuddy имеет функцию, которая объясняет Ваш regexpression на простом английском языке. Это могло бы сделать немного легче учиться.