【问题标题】:Trouble matching multiple patterns in Ruby (regex)在 Ruby 中匹配多个模式时遇到问题(正则表达式)
【发布时间】:2012-07-11 02:47:30
【问题描述】:

流动的正则表达式有什么区别: HEAD|GET, (HEAD|POST) & [HEAD|POST]?

基本上,我想在 HEAD 或 POST 之后提取数字。

irb(main):001:0> "This is HEAD and a POST".match("HEAD|POST")
=> #<MatchData "HEAD">
irb(main):002:0> "This is HEAD and a POST".match("(HEAD|POST)")
=> #<MatchData "HEAD" 1:"HEAD">
irb(main):003:0> "This is HEAD and a POST".match("[HEAD|POST]")
=> #<MatchData "T">
irb(main):004:0> "This is HEAD 1 and a POST 2".match("[HEAD|POST] (.)")
=> #<MatchData "D 1" 1:"1">
irb(main):005:0>

最后一个正则表达式与“POST”之后的“2”不匹配。为什么?还有,为什么要匹配“D 1”?

【问题讨论】:

    标签: ruby regex pattern-matching


    【解决方案1】:

    HEAD|POST(HEAD|POST) 匹配相同的字符串(HEAD 或 POST);第二个捕获字符串,而第一个没有。

    [HEAD|POST] 匹配单个字符,任何 ADEHOPST 或 |。所以"This is HEAD and a POST".match("[HEAD|POST]") 匹配This 中的单个字符T

    另一方面,"This is HEAD 1 and a POST 2".match("[HEAD|POST] (.)") 不能匹配前导 T,因为它后面没有空格 - 相反,它匹配 HEAD 末尾的单个 D,加上空格和1 关注,捕获 1。

    【讨论】:

    • 那么,在找到第一个模式后匹配停止,对吧?另外,你说T后面没有空格但是T 2之间不是有空格吗?
    • 没错。正则表达式从左到右查看字符串,当证明存在匹配时停止。是的,T 2 中有一个空格,但正则表达式永远不会到达那里,因为它首先匹配D 1(来自HEAD 1)。如果您想要所有匹配项,那么 seph 的 scan 很好。
    • 好的。还有一件事,而不是做[HEAD|POST] (.),我也可以做[D|T] (.),它会给我同样的东西。如何匹配完整的单词,而不是只匹配字符类中的单个字符?
    • @yetanotherstacker - 用圆括号(“组”)替换方括号(“匹配任何字符”)。 /(HEAD|POST) (.)/ 将匹配“HEAD 1”(并停止),将“HEAD”捕获到第 1 组,将“1”捕获到第 2 组。如果您不想捕获,可以使用 ?: 扩展名:(?:HEAD|POST) (.)将匹配并仅将“1”捕获到第 1 组中。
    【解决方案2】:

    尝试扫描:

    "This is HEAD 1 and a POST 2".scan /(HEAD|POST)\s(\d)/
    
    => [["HEAD", "1"], ["POST", "2"]]
    

    【讨论】:

    • 感谢您提供答案,但您没有说明为什么我得到“D 1”以及差异?这将极大地帮助我理解它们。
    • Chowlett 很好地解释了您的代码发生了什么。这是涉及捕获和字符类的基本正则表达式。 scan 的美妙之处在于一个简单的正则表达式可以扫描一堆数据并将其放入一个数组中:“如果有一个 HEAD 或 POST 后跟一个空格字符后跟一个数字,那么给我 HEAD 或 POST 和数字"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2022-06-10
    • 2015-10-08
    • 2014-08-22
    • 2012-01-06
    相关资源
    最近更新 更多