如何在Ruby中匹配多个正则表达式模式

4
我看到了一些关于多个正则表达式模式在不同情境下的问题,但我无法掌握它。
我有一个字符串 str = "Hello, how are you. Hello, I am lloyds" ,我想一次性应用多个模式来提取所有的Hello和所有的ll,以获得["Hello", "Hello", "ll", "ll", "ll"]。我该怎么做?
我唯一能做的方式是(这不是一次性使用多个模式):
str = "Hello, how are you. Hello, I am lloyds"
a = []
a << str.scan(/Hello/)
a << str.scan(/ll/)
a.flatten

2
你所拥有的最好写成 str.scan(/Hello/) + str.scan(/ll/)。而且,说实话,我认为单独使用正则表达式很可能比任何其他复杂的单一正则表达式更清晰明了。 - Andrew Marshall
2个回答

8
因为"ll"在"Hello"内部,所以在同一个扫描方法调用中包含两者的逻辑需要一个略显笨拙的表达式来双重捕获"ll"。这看起来很接近,但请注意,该序列交错排列了"Hello"和"ll",与预期输出不同。然而,就我所见,这对于任何只通过字符串进行单次扫描的正则表达式都是必要的。
str = "Hello, how are you. Hello, I am lloyds"
a = str.scan( /(He(ll)o|ll)/ ).flatten.compact
 => ["Hello", "ll", "Hello", "ll", "ll"]

使用紧凑形式是必要的,因为单独的 "ll" 不会匹配内部捕获,并且数组中可能包含不需要的 nil


1
str = "Hello, how the hello are you. Hello, I am lloyds"
results = []

str.scan(/hello|ll/xmi) do |match|
  target = match.downcase
  results.unshift match if target == 'hello'
  results << 'll'
end

p results

--output:--
["Hello", "hello", "Hello", "ll", "ll", "ll", "ll"]

或者:

str = "Hello, how the hello are you. Hello, I am lloyds"
hello_count = 0
ll_count = 0

str.scan(/Hello|ll/xm) do |match|
  hello_count += 1 if match == 'Hello'
  ll_count += 1 
end

results = ["Hello"] * hello_count + ["ll"] * ll_count 
p results

--output:--
["Hello", "Hello", "ll", "ll", "ll", "ll"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接