作为记录,我使用的是R,但我的查询是独立于平台的(就目前而言(,所以我将使用regex101进行演示。我试图捕捉重复的组,这些组可能会也可能不会被其他文本包围。因此,此演示显示了理想的行为: 演示1
正则表达式:(d{2})(AB)
文本:blahblah11AB12AB13ABblah
因此,它很好地捕获了我想要的所有组:
匹配 1
Full match 8-12 `11AB`
Group 1. 8-10 `11`
Group 2. 10-12 `AB`
匹配 2
Full match 12-16 `12AB`
Group 1. 12-14 `12`
Group 2. 14-16 `AB`
三消
Full match 16-20 `13AB`
Group 1. 16-18 `13`
Group 2. 18-20 `AB`
但是,如果我包含另一段匹配的文本,它也会捕获它(我想这很公平(
文本:blahblah11AB12AB13ABblah22AB
返回相同但带有额外组:
匹配 4
Full match 24-28 `22AB`
Group 1. 24-26 `22`
Group 2. 26-28 `AB`
演示2
我想做的是捕获第一组,但忽略所有其他文本,即使有后续匹配。从本质上讲,我只想从这篇文章中得到三个匹配项:blahblah11AB12AB13ABblah22AB
我已经尝试了很多事情,例如:(((d{2})(AB))+)(.*)
但是后来我得到以下内容,它丢失了所有最后的组捕获:
演示 3
匹配 1
Full match 8-28 `11AB12AB13ABblah22AB`
Group 1. 8-20 `11AB12AB13AB`
Group 2. 16-20 `13AB`
Group 3. 16-18 `13`
Group 4. 18-20 `AB`
Group 5. 20-28 `blah22AB`
我需要一些保留重复组的东西。我被难住了!
在 R 中,输出应如下所示:
[[1]]
[,1] [,2] [,3]
[1,] "11AB" "11" "AB"
[2,] "12AB" "12" "AB"
[3,] "13AB" "13" "AB"
提前感谢...
一个想法是使用G
将比赛链接起来,以^
开始并在之后K
重置。
(?:^.*?K|G)(d{2})(AB)
^.*?K
将在第一次匹配之前懒惰地匹配任意数量的任意字符|G
或继续在上一场比赛结束时,可以是:开始,第一,上一个
查看更新的演示
这将匹配第一个火柴链,并且是 pcre 模式 (perl=TRUE
(。
如果在第一次匹配之前只能有非数字,请使用^D*K
而不是^.*?K
。
您可以使用量词{3}
来获取 3 个第一组:(((d{2})(AB)){3})
.查看演示
如果我理解正确,问题出在括号的位置上。
pattern <- "(\d{2}AB)"
s <- "blahblah11AB12AB13ABbla"
m <- gregexpr(pattern, s)
regmatches(s, m)
#[[1]]
#[1] "11AB" "12AB" "13AB"
s2 <- "blahblah11AB12AB13ABblah22AB"
s3 <- "11AB12AB13ABblah22AB"
S <- c(s, s2, s3)
m <- gregexpr(pattern, S)
regmatches(S, m)
#[[1]]
#[1] "11AB" "12AB" "13AB"
#
#[[2]]
#[1] "11AB" "12AB" "13AB" "22AB"
#
#[[3]]
#[1] "11AB" "12AB" "13AB" "22AB"
请注意,很多时候它只在一个代码行中运行。我这样离开是为了更清楚。
编辑。
也许以下内容可以满足OP的要求。
我敢打赌有更好的解决方案,在我看来,两个正则表达式是矫枉过正的。
pattern <- "((\d{2}AB)+)([^[:digit:]AB]+(\d{2}AB))"
pattern2 <- "(\d{2}AB)"
m <- gregexpr(pattern2, gsub(pattern, "\1", S))
regmatches(S, m)
#[[1]]
#[1] "11AB" "12AB" "13AB"
#
#[[2]]
#[1] "11AB" "12AB" "13AB"
#
#[[3]]
#[1] "11AB" "12AB" "13AB"