当前位置:  开发笔记 > 后端 > 正文

返回Ruby正则表达式的第一场比赛

如何解决《返回Ruby正则表达式的第一场比赛》经验,为你挑选了4个好方法。

我正在寻找一种在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)。



1> Presidenten..:

你可以试试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确实发生了短路并且只找到了第一个匹配.
@dmourati您可以在[String#\ [\]](http://www.ruby-doc.org/core-2.1.2/String.html#method-i-5B-5D)中找到此功能.感谢您询问该文档,因为在阅读它时我发现了`capture`参数 - 它允许您返回捕获而不是完全匹配.
整洁,不知道这个捷径.

2> Benjamin Cro..:

你可以使用[]:(就像match)

"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches what is inside ()
# => "account2"
"foo+account2@gmail.com"[/\+([^@]+)/, 0] # matches whole regexp
# => "+account2"


最完整的答案

3> Slartibartfa..:

如果只有匹配的存在是重要的,你可以去

/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



4> Felix..:

我尚不确定此功能是很棒还是完全疯狂,但是您的正则表达式可以定义局部变量。

/\$(?\d+)\.(?\d+)/ =~ "$3.67" #=> 0
dollars #=> "3"

(摘自http://ruby-doc.org/core-2.1.1/Regexp.html)。

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有