我想创建一个正则表达式来指定括号之间的单词。例如,我有一个这样的字符串:
"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都会运行。
答案 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)