2011-12-30 4 views
3

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

r = /(hell|hello)/ 

"hello".scan(r) #=> ["hell"] 

, но я хотел бы получить [ "hell", "hello" ].

http://rubular.com/r/IxdPKYSUAu

+3

Либо проверить его дважды, или выяснить, какие строки содержат друг друга и вычислить соответствует себя после проверки только самый длинный – klochner

ответ

5

Вы можете использовать любитель захвата:

'hello'.match(/((hell)o)/).captures 
=> ["hello", "hell"] 
+0

Это действительно фантазия :-) –

1

Нет, регулярные выражения не работают, как это. Но вы можете сделать что-то вроде этого:

terms = %w{hell hello}.map{|t| /#{t}/} 

str = "hello" 

matches = terms.map{|t| str.scan t} 

puts matches.flatten.inspect # => ["hell", "hello"] 
-1

Вы могли бы сделать что-то вроде этого:

r = /(hell|(?<=hell)o)/ 

"hello".scan(r) #=> ["hell","o"] 

Это не даст вам ["hell", "hello"], а ["hell", "o"]

0

Ну, вы всегда можете взять из общего подвыражения. То есть, следующие работы:

r = /hello{0,1}/ 

"hello".scan(r) #=> ["hello"] 
"hell".scan(r) #=> ["hell"] 
+1

Или используйте более простой '/ hello? /' –

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