2012-05-21 3 views
2

Я хочу регулярное выражение, которое будет извлекать слова счастливые и хорошие, как не жадные, так и оба без учета регистра.regex формат для двух строк

@a = [" I am very HAppy!!", "sad today..", "happy. to hear about this..", "the day is good", "sad one", "sad story"] 

Похоже, это работает с одним словом:

@z = @a.join.scan(/\bhappy\b/i) 

Но когда я добавляю в хорошо он не работает, как я ожидал.

@z = @a.join.scan(/\bhappy|good\b/i) 

Ожидать (счастливый 2x и хороший 1x):

@z.size => 3 

В результате это дает мне:

@z.size => 2 
+2

«не работает, как я ожидаю» - что вы ожидаете и что он делает? –

ответ

7

Вы должны добавить круглые скобки вокруг чередования так, что \b s будет применяться к любому happy или good в качестве единицы:

\b(happy|good)\b 

Затем, вы, вероятно, хотите сканировать каждый элемент @a массива, а не @a.join так map и flatten называются для:

@a.map { |s| s.scan(/\b(happy|good)\b/i) }.flatten 
# ["HAppy", "happy", "good"] 

Вы можете также использовать не захватывая группы:

\b(?:happy|good)\b 

, но это не будет иметь никакого значения в этом случае.

0

Я предполагаю, что вы имеете в виду, что соответствует и счастливым, но не очень хорошо. Это потому, что вы смотрите на границы слов, и когда вы присоединяетесь к строке, она становится товаром.

Извлеките граничные условия слова и оно должно соответствовать ожидаемому.

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