我正在尝试构造一个正则表达式来识别字符串,其中工作“pack”/“pck”/“pack”/“Set”(不区分大小写),如果是(字存在),则提取前面的数字或跟着这个词。例子:
"Fregon EcoClean Multipurpose Scrubber For Pots, Pans, Kitchen, and Bathroom, Green, 3-Pack" -> 3
Bathroom, Green, 3 Pack" -> 3
"Franklin Sports NHL Mini Hockey Goal Set of 2" ->2
"Make: Electronics Components Pack 2" -> 2
"Make: Electronics Components Pack of 2 -> 2
我尝试使用以下表达式:
sub(".*pack(\\d+).*", "\\1", "inflow100 pack6 distance12")
但是,它不符合上述所有情况。 有什么想法吗?
答案 0 :(得分:5)
以下正则表达式匹配所有示例:
\b(?:(\d+)[-\s][Pp]ack|(?:[Pp]ack|[Ss]et)\s?(?:of\s)?(\d+))
请参阅https://regex101.com/r/jZ4vE2/1
如果您使用它,您会注意到该号码放在\ 1或\ 2中。唯一要做的就是摆脱前面或后面的空格。
> gsub(".*\\b(?:(\\d+)[-\\s][Pp]ack|(?:[Pp]ack|[Ss]et)\\s?(?:of\\s)?(\\d+)).*", "\\1 \\2", "inflow100 pack6 distance12", perl=TRUE)
[1] " 6"
答案 1 :(得分:1)
只需获取最后一个号码。
sub(".*\\b(\\d+).*", "\\1", str)
或
sub("(\\d+)\\D*$|.", "\\1", str)