我正在寻找一种在Ruby中对字符串执行正则表达式匹配的方法,并在第一次匹配时使其短路.
我正在处理的字符串很长,看起来标准方式(match
方法)会处理整个事物,收集每个匹配,并返回包含所有匹配项的MatchData对象.
match = string.match(/regex/)[0].to_s
Presidenten.. 131
你可以试试variableName[/regular expression/]
.这是irb的示例输出:
irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders" => "erik kalle johan anders erik kalle johan anders" irb(main):004:0> names[/kalle/] => "kalle"
在对各种长度字符串进行一些基准测试并查看C源之后,事实证明Regex.match确实发生了短路并且只找到了第一个匹配. (6认同)
@dmourati您可以在[String#\ [\]](http://www.ruby-doc.org/core-2.1.2/String.html#method-i-5B-5D)中找到此功能.感谢您询问该文档,因为在阅读它时我发现了`capture`参数 - 它允许您返回捕获而不是完全匹配. (5认同)
整洁,不知道这个捷径. (3认同)
Benjamin Cro.. 58
你可以使用[]
:(就像match
)
"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches what is inside () # => "account2" "foo+account2@gmail.com"[/\+([^@]+)/, 0] # matches whole regexp # => "+account2"
最完整的答案 (3认同)
Slartibartfa.. 22
如果只有匹配的存在是重要的,你可以去
/regexp/ =~ "string"
无论哪种方式,match
只应返回第一个scan
匹配,同时搜索整个字符串.因此如果
matchData = "string string".match(/string/) matchData[0] # => "string" matchData[1] # => nil - it's the first capture group not a second match
Felix.. 5
我尚不确定此功能是很棒还是完全疯狂,但是您的正则表达式可以定义局部变量。
/\$(?\d+)\.(? \d+)/ =~ "$3.67" #=> 0 dollars #=> "3"
(摘自http://ruby-doc.org/core-2.1.1/Regexp.html)。
你可以试试variableName[/regular expression/]
.这是irb的示例输出:
irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders" => "erik kalle johan anders erik kalle johan anders" irb(main):004:0> names[/kalle/] => "kalle"
你可以使用[]
:(就像match
)
"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches what is inside () # => "account2" "foo+account2@gmail.com"[/\+([^@]+)/, 0] # matches whole regexp # => "+account2"
如果只有匹配的存在是重要的,你可以去
/regexp/ =~ "string"
无论哪种方式,match
只应返回第一个scan
匹配,同时搜索整个字符串.因此如果
matchData = "string string".match(/string/) matchData[0] # => "string" matchData[1] # => nil - it's the first capture group not a second match
我尚不确定此功能是很棒还是完全疯狂,但是您的正则表达式可以定义局部变量。
/\$(?\d+)\.(? \d+)/ =~ "$3.67" #=> 0 dollars #=> "3"
(摘自http://ruby-doc.org/core-2.1.1/Regexp.html)。