2016-07-15 2 views
-1

Я пишу небольшое приложение апи Rails, и мне нужно проанализировать строку, чтобы найти слова, имеющие заданную строку как:слово, включая заданную строку в Ruby,

Предполагая, что мой исходный текст является hello mr one two three four nine nineteen, и я хочу, чтобы проверить вхождение on , он произведет: one, и если я проверил возникновение ne t в той же строке, это приведет к one two.

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

Пожалуйста, сообщите, если вам нужна дополнительная информация, спасибо.

ответ

3
▶ str = 'hello mr one two three four nine nineteen' 
#⇒ "hello mr one two three four nine nineteen" 
▶ re = ->(pattern) { /\p{L}*#{pattern}\p{L}*/ } 
▶ str[re.('ne t')] 
#⇒ "one two" 
▶ str[re.('on')] 
#⇒ "one" 

Matcher \p{L}, как правило, лучше, чем \w и, особенно, \S потому что это соответствует все UTF-8 букв.

Чтобы соответствовать акцентированные буквы а (. Я е в сочетании в «наивным»,.) Одна должна простираться левый и правый matchers:

▶ re = ->(pattern) { /[\p{L}\p{Mc}]*#{pattern}[\p{L}\p{Mc}]*/ } 

Пожалуйста, обратите внимание, что приведенный выше код будет возвращать первый матч. Для того, чтобы вернуть все матчи, использовать String#scan вместо String#[]:

▶ str.scan re.('ni') 
#⇒ ["nine", "nineteen"] 
+0

спасибо, это действительно то, что мне нужно! – AndreyS

+0

... или введите метод: 'def match (str, pattern); ул [/ [\ р {L} \ р {Мк}] * # {шаблон} [\ р {L} \ р {Мк}] * /]; end'. (я тоже) –

+0

Спасибо, Кэри, оцените! – mudasobwa

0

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

search = "on" 
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1] 
# returns "one" 

search = "ne t" 
/\s([^\s]*#{search}.[^\s]*)\s/.match("hello mr one two three four nine nineteen")[1] 
# returns "one two" 

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

+1

'[^ \ s]' должно быть записано как '\ S', и ваше решение будет соответствовать пунктуации, как запятые, точки и т.д. Кроме того, он не будет соответствовать словам в начале строки («привет» в приведенном примере) и словами, заканчивающими строку («девятнадцать».) Тем не менее, это решение не является ни надежным, ни даже правильным. – mudasobwa

Смежные вопросы