如何在每行第一次出现匹配时停止匹配?

时间:2019-06-27 18:40:01

标签: r regex

我试图在多个字符串首次出现时停止模式匹配

以下是我想使用A-Z | 0-9_A-Z匹配的字符串

248_HIGH_FAN_BLADE,
67B_COOLER_BLADE,
BLADE_LOW_DIM
[A-Z|0-9\_A-Z](.*?)

我只想在第一个字符串中匹配8_H,在第二个字符串中匹配B_C,仅在第三个字符串中匹配E_L。不应显示其他匹配项。我正在使用php在regex101网站上尝试并在R中实现

3 个答案:

答案 0 :(得分:1)

您可以使用

(?m)^.*?\K[0-9A-Z]_[0-9A-Z]

请参见regex demo

R matching code

x <- "248_HIGH_FAN_BLADE,\n67B_COOLER_BLADE,\nBLADE_LOW_DIM"
regmatches(x, gregexpr("(?m)^.*?\\K[0-9A-Z]_[0-9A-Z]", x, perl=TRUE))
# => [[1]]
# => [1] "8_H" "B_C" "E_L"

详细信息

  • (?m)-多行修饰符,使^与行首匹配
  • ^-一行的开头
  • .*?-除换行符以外的任何0+个字符都应尽可能少
  • \K-匹配重置运算符
  • [0-9A-Z]-大写字母/数字
  • _-下划线
  • [0-9A-Z]-大写字母/数字

您也可以使用基于stringr的正则表达式的解决方案:

library(stringr)
str_match_all(x, "(?m)^.*?([0-9A-Z]_[0-9A-Z])")[[1]][,2]
# => [1] "8_H" "B_C" "E_L"

答案 1 :(得分:0)

使用纵梁:

library(stringr)
str_extract(c("248_HIGH_FAN_BLADE", "67B_COOLER_BLADE", "BLADE_LOW_DIM"), pattern = "[0-9A-Z]\\_[A-Z]" )

答案 2 :(得分:0)

要匹配该模式,您可以使用捕获组并捕获单个[A-Z0-9],然后捕获_,然后捕获单个[A-Z0-9]

\b[A-Z0-9]+([A-Z0-9]_[A-Z0-9])

说明

  • \b单词边界(或使用锚点^声明字符串的开头)
  • [A-Z0-9]+匹配1+次A-Z或0-9
  • (捕获组1
    • [A-Z0-9]_[A-Z0-9]匹配1次A-Z0-9,然后匹配_,再匹配一次A-Z0-9
  • )关闭捕获组

Regex demo | R demo

例如

library(stringr)
string = "248_HIGH_FAN_BLADE"
pattern = "\\b[A-Z0-9]+([A-Z0-9]_[A-Z0-9])";
str_match_all(string, pattern)[[1]][,2]

结果

[1] "8_H"