我试图在多个字符串首次出现时停止模式匹配
以下是我想使用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中实现
答案 0 :(得分:1)
您可以使用
(?m)^.*?\K[0-9A-Z]_[0-9A-Z]
请参见regex demo
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 )
关闭捕获组例如
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"