Regex проблема с поиском слов частично

У меня есть регулярное выражение, которое работает для некоторых слов, но не для всех:

str.scan(/typeaheadResult\(\{\"Q\":("\w+\s?\w+\s?\w+\s?\w+"),\"R\":\[+("\w+\s?\w+\s?\w+\s?\w+")/)

Строка, которая, кажется, не захвачена, ниже:

if (typeof typeaheadResult !== "undefined") { typeaheadResult({"Q":"crapshoot","R":[]}) }

Мое регулярное выражение не работает для вышеуказанной строки, и я не думаю, что это из-за неуместного используемого слова. Вот краткая постоянная ссылка на то, что я пробовал: http://rubular.com/r/WOr7xYPePs В нем есть остальные примерные строки, которые важны.

2 ответа

Решение

Часть после R:[ должно содержать не менее 4 \w символы между ",

Если это не является обязательным, вы должны добавить ?,

Обновить

Просто добавив ? в конце вашего регулярного выражения решает проблему: http://rubular.com/r/HUmtoffTmi

Я предположил, что в каждом абзаце не более одного совпадения, и для совпадения в данном абзаце "[]" следует "R: или строка, следующая за "Q":" и заканчивая символом, предшествующим следующей двойной кавычке, начинается со строки, следующей за "R":[[" и заканчивая символом, предшествующим следующей двойной кавычке.

str =<<BITTER_END
\if (typeof typeaheadResult !== "undefined") { typeaheadResult({"Q":"standing desk Mike","R":[["standing desk",[["Home",4044]]],"standing desk converter","adjustable standing desk","standing desk 48","tabletop standing desk","glass standing desk desk"]}) }

if (typeof typeaheadResult !== "undefined") { typeaheadResult({"Q":"laptop bag","R":[["laptop bag",[["Electronics",3944]]],"laptop bags for 15.6 inch laptops","laptop bags for women","laptop bag 15.6","laptop bags for 17.3 in laptops","rolling laptop bag","laptop bag with wheels","laptop bag 17\""]}) }

\if (typeof typeaheadResult !== "undefined") { typeaheadResult({"Q":"sitting desk Melba","R":[["standing desk",[["Home",4044]]],"standing desk converter","adjustable standing desk","standing desk 48","tabletop standing desk","glass standing desk desk"]}) }

if (typeof typeaheadResult !== "undefined") { typeaheadResult({"Q":"crapshoot hello","R":[]}) }
BITTER_END

r = /
    typeaheadResult\(\{\"Q\":\" # match 'typeaheadResult({"Q":"'
    ([[[:alnum:]]\s]+)   # match letters, digits and spaces in capture group 1
    \",\"R\":            # match string
    (?:                  # begin non-capture group
      \[\[\"             # match 2 left brackets and a double quote
      ([[[:alnum:]]\s]+) # match > 0 letters, digits and spaces in capture group 2
      |                  # or
      (\[\])             # match left then right bracket in capture group 3
    )                    # end non-capture group
    /x                   # free-spacing regex definition mode

str.split(/\n\n+/).map do |s|
  ss = s[r]
  ss = nil unless (($2 && $1 =~ /\A#{$2}/) || $3=="[]")
  ss
end.compact
  #=> ["typeaheadResult({\"Q\":\"standing desk Mike\",\"R\":[[\"standing desk",
  #    "typeaheadResult({\"Q\":\"laptop bag\",\"R\":[[\"laptop bag",
  #    "typeaheadResult({\"Q\":\"crapshoot hello\",\"R\":[]"] 

Вы можете пометить возможные плохие данные, если $2 не является nil а также $1.begins_with($2) является false,

Другие вопросы по тегам