4

我在不同的上下文中看到了关于多个正则表达式模式的几个问题,但我无法掌握它。

我有一个字符串str = "Hello, how are you. Hello, I am lloyds",我想在其中应用多种模式来一次提取所有Hellos 和所有lls 以获得["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
4

2 回答 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的 s。

于 2013-09-15T16:12:19.943 回答
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"]
于 2013-09-15T17:30:27.160 回答