在以下字符串中提取第二个匹配项

时间:2016-09-06 11:00:48

标签: regex r gsub

考虑以下具有预期输出的字符串。

"NE-390-SM-04"                 --> "390-SM-04"
"90055-SL-01-J"                --> "90055-SL-01"
"NE-1478-SL-02"                --> "1478-SL-02"
"87007-QM-01-J"                --> "87007-QM-01"
"NE-9315-BM-01-A"              --> "9315-BM-01"
"3121-SP-01"                   --> "3121-SP-01" 
"1639-YL-01"                   --> "1639-YL-01"
"NE-9922-WM-01-J"              --> "9922-WM-01"
"ND-2498-YL-01"                --> "2498-YL-01"
"C-4008-PP-03-J"               --> "4008-PP-03"
"876-C-4008-PP-03-J-234"       --> "4008-PP-03"

有没有办法提取出现的(尤其是第二次出现) R中的[0-9]+-[a-zA-Z]+-[0-9]+

我能够使用正则表达式引用这些部分:([0-9]+-[a-zA-Z]+-[0-9]+) 我对与上述模式匹配的最核心部分感兴趣。

希望我已经说清楚了。如果您需要任何澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以在开始时使用延迟点匹配模式,最后使用贪婪点匹配模式,并在替换模式中使用带有反向引用的捕获组,确保限制量词{2,}中间的字母数量至少为2:

x <- c("NE-390-SM-04", "90055-SL-01-J", "NE-1478-SL-02", "87007-QM-01-J", "NE-9315-BM-01-A", "3121-SP-01", "1639-YL-01", "NE-9922-WM-01-J", "ND-2498-YL-01", "C-4008-PP-03-J", "876-C-4008-PP-03-J-234")
sub("^.*?([0-9]+-[a-zA-Z]{2,}-[0-9]+).*", "\\1", x)

请参阅R demoregex demo

模式详情

  • ^.*? - 尽可能少地开始字符串和零个或多个字符
  • ([0-9]+-[a-zA-Z]{2,}-[0-9]+) - 您的模式匹配1位数字,连字符,2 +字母,连字符,1 +位数
  • .* - 任意多个字符,尽可能多到字符串结尾。

如果您不将{2,}与字母匹配子模式一起使用,则会在上一个876-C-4008中获得876-C-4008-PP-03-J-234