Cirque Black Stone效果陶瓷地砖,每包9个,(L)333毫米(宽)333毫米
我创建了一个块,它遍历一组结果,我需要匹配长度(L)333mm和宽度(W)333mm,这样我就可以将它们添加到数据库中。
我已经尝试了一些正则表达式,但现在没有正常工作,感觉我只是在猜测。
product_description = product.at_css('h3 a').text[/\L[0-9\.]+mm/]
给nil
,请指点我正确的方向
答案 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