Ruby正则表达式匹配维度

时间:2018-01-31 16:59:41

标签: ruby regex testing web-scraping nokogiri

Cirque Black Stone效果陶瓷地砖,每包9个,(L)333毫米(宽)333毫米

我创建了一个块,它遍历一组结果,我需要匹配长度(L)333mm和宽度(W)333mm,这样我就可以将它们添加到数据库中。

我已经尝试了一些正则表达式,但现在没有正常工作,感觉我只是在猜测。

product_description = product.at_css('h3 a').text[/\L[0-9\.]+mm/]

nil,请指点我正确的方向

1 个答案:

答案 0 :(得分:1)

这是一个乱序,len / width正则表达式,一次性获得两个 取决于条件,所以这是Ruby支持它们。

值位于各自的命名组中。

修改 对于Ruby,可以像这样完成乱序。 请注意,大多数引擎允许您在解析组之前引用它 使用Ruby,你必须至少在组的开头才能进入 能够引用它的(当前)内容。

(?:\s*(?:\(W\)(?<width>(?(<width>)(?!))[\d.]+)(?<width_unit>[cm]?m|in|ft)|\(L\)(?<len>(?(<len>)(?!))[\d.]+)(?<len_unit>[cm]?m|in|ft))){1,2}

http://rubular.com/r/SMw5bxHVYv

格式化

 (?:
      \s* 
      (?:
           \(W\)
           (?<width>                     # (1 start), Width
                (?(<width>)                   # Conditional, cannot match width again
                     (?!)
                )
                [\d.]+ 
           )                             # (1 end)
           (?<width_unit> [cm]? m | in | ft )  # (2)
        |  \(L\)
           (?<len>                       # (3 start), Len
                (?(<len>)                     # Conditional, cannot match length again
                     (?!)
                )
                [\d.]+ 
           )                             # (3 end)
           (?<len_unit> [cm]? m | in | ft )  # (4)
      )
 ){1,2}    # Must match one or two

对于其他引擎,您可以在组定义之前放置条件 (或在小组的开头,如上所述)

(?:\s*(?:(?(<width>)(?!))\(W\)(?<width>[\d.]+)(?<width_unit>[cm]?m|in|ft)|(?(<len>)(?!))\(L\)(?<len>[\d.]+)(?<len_unit>[cm]?m|in|ft))){1,2}

https://regex101.com/r/VyCqjt/2

格式化

 (?:
      \s* 
      (?:
           (?(<width>) (?!) )     # Conditional, cannot match width again
           \(W\)
           (?<width> [\d.]+ )                  # (1)
           (?<width_unit> [cm]? m | in | ft )  # (2)
        |
           (?(<len>) (?!) )        # Conditional, cannot match length again
           \(L\)
           (?<len> [\d.]+ )                 # (3)
           (?<len_unit> [cm]? m | in | ft ) # (4)
      )
 ){1,2}     # Must match one or two