Совпадение нескольких слов в любом месте строки - PullRequest
0 голосов
/ 09 мая 2018

Я хочу проверить, присутствуют ли все слова в строке selection в другой строке. Там будет произвольное количество слов. Это не ИЛИ. Все слова ДОЛЖНЫ присутствовать в совпадении. Заказ не имеет значения. Например, когда selection равно "John Zeni", оно должно совпадать с " John Paul Zeni", поскольку в сопоставителе есть и "John", и "Zeni". Если selection было просто "John", то оно должно совпадать, но, поскольку существует несколько слов, все слова должны совпадать. Требуется решение регулярных выражений.

Вот что я попробовал:

selection = "John Zeni"
pattern = selection.split(" ").join("|")
# => "John|Zeni"
/#{Regexp.quote(pattern)}/
# => /John\|Zeni/ 
" John Paul Zeni".match(/#{Regexp.quote(pattern)}/)
# => nil 

Почему это не совпадает? Проблема с Regexp.quote Я думаю. Важно, чтобы оба слова совпадали в сопоставителе. Это также не должно совпадать:

" John Paul Zeni" =~ /(John|Zach)/ 
# => 1

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
("John Zeni".split - "John Paul Zeni".split).empty?
  #=> true

Если str может содержать знаки препинания, мы должны удалить эти символы перед разделением.

("John Zeni Lola".split - "John Lola Paul, Zeni.".gsub(/[[:punct:]]/,'').split).empty?
  #=> true
0 голосов
/ 09 мая 2018

Используйте положительные взгляды для имитации AND:

string = "Paul Zach"
re = '^(?=.*' + string.split(/\s+/).map{ |x| Regexp.quote(x) }.join(')(?=.*') + ')'
"John Paul Mak Zach Jack Zen" =~ /#{re}/

Если необходимо сопоставить несколько строк, включите флаг m или используйте [\s\S] вместо .. Вы можете убедиться, что слова не входят в другие слова, используя \b маркер вокруг них.

Примечание: порядок не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...