正则表达式中可选的空格

时间:2014-12-19 11:32:49

标签: ruby regex

我想创建一个正则表达式来指定括号之间的单词。例如,我有一个这样的字符串:

"something(a,b)"

"something(c, d)"

我想从括号中提取字母。

在第一个字符串中,我想获得一个数组['a','b']。在第二个中,我想要数组['c','d']

我有以下方法:

def suffixes(t)
  (t.scan /\((\w+),(\w+)\)/).flatten
end

但这只适用于第一种情况。在第二个变体中,我有:

def suffixes(t)
  (t.scan /\((\w+),[\s](\w+)\)/).flatten
end

但这仅适用于第二种情况。我不知道在两种情况下regexp都会运行。

4 个答案:

答案 0 :(得分:3)

您可以使用:

def suffixes(t)
  (t.scan /\((\w+)\s*,\s*(\w+)\)/).flatten
end

\s*将匹配逗号前后的0或更多空格。

答案 1 :(得分:1)

将中间\s设为可选。

def suffixes(t)
  (t.scan /\((\w+),\s?(\w+)\)/).flatten
end
?之后

\s会将空格转为可选( 0或1 )。

答案 2 :(得分:1)

我建议你区分"扫描"用于括号之间的文本和"分裂"逗号的结果:

s = "something(c, d)"
s.match( /\((.+)\)/ )[1] # found text between parentheses
 .split(/,/)             # split the result by comma
 .map(&:strip)           # stripped the values

在我的理解中,它更像Ruby。希望它有所帮助。

UPD 感谢@theTinMan,有两种方法可以改善答案。首先,s[/\((.+)\)/, 1]看起来更好,执行速度比s.match( /\((.+)\)/ )[1]更快。二级,按字符串拆分比通过正则表达式拆分更快。总结:

s = "something(c, d)"
s[ /\((.+)\)/, 1 ] # found text between parentheses
 .split(',')       # split the result by comma
 .map(&:strip)     # stripped the values

证明:

require 'benchmark'

n = 1_000_000
s = "something(c, d)" 

Benchmark.bm do |x| 
  x.report { n.times { s.match( /\((.+)\)/ )[1].split(/,/).map(&:strip) } } 
  x.report { n.times { s.match( /\((.+)\)/ )[1].split(',').map(&:strip) } } 
  x.report { n.times { s[/\((.+)\)/, 1].split(/,/).map(&:strip) } } 
  x.report { n.times { s[/\((.+)\)/, 1].split(',').map(&:strip) } } 
end

#       user     system      total        real
#   3.590000   0.000000   3.590000 (  3.598151)
#   3.030000   0.000000   3.030000 (  3.028137)
#   2.940000   0.000000   2.940000 (  2.942490)
#   2.180000   0.000000   2.180000 (  2.182447)

答案 3 :(得分:0)

\((\w+)|(?!^)\G\s*,\s*(\w+)

试试这个。这适用于所有参数。参见演示。

https://regex101.com/r/vN3sH3/27