R 两个字符组之间交替模式的正则表达式

R 两个字符组之间交替模式的正则表达式,r,regex,R,Regex,我试图找到两个字符组(D\E和R\K\H)之间模式交替的匹配项 我提出的模式(通过阅读这里的其他帖子)是 将此模式与以下测试字符串一起使用:drk 我得到以下匹配项:DR,drd,RD 我要:DRE,drdr,RDK 匹配项缺少每组的最后一个字母 请有人帮我找出原因。将第一组与第二组匹配,然后将第二组与所有匹配次数匹配,然后可能再匹配第一组。i、 e.([DE][RKH])+[DE]?,或与交换的组相同,即([RKH][DE])+[RKH]?或仅第一组,即[DE],或仅第二组,即[RKH]: l

我试图找到两个字符组(D\E和R\K\H)之间模式交替的匹配项

我提出的模式(通过阅读这里的其他帖子)是

将此模式与以下测试字符串一起使用:drk

我得到以下匹配项:DR,drd,RD

我要:DRE,drdr,RDK

匹配项缺少每组的最后一个字母


请有人帮我找出原因。

将第一组与第二组匹配,然后将第二组与所有匹配次数匹配,然后可能再匹配第一组。i、 e.
([DE][RKH])+[DE]?
,或与交换的组相同,即
([RKH][DE])+[RKH]?
或仅第一组,即
[DE]
,或仅第二组,即
[RKH]

library(gsubfn)

x <- "DREDRDRDRARDK" # input

rx <- "(([DE][RKH])+[DE]?|([RKH][DE])+[RKH]?|[DE]|[RKH])"
strapply(x, rx)
## [[1]]
## [1] "DRE"    "DRDRDR" "RDK"  
库(gsubfn)

x将第一组和第二组的所有匹配次数匹配,然后可能再匹配第一组。i、 e.
([DE][RKH])+[DE]?
,或与交换的组相同,即
([RKH][DE])+[RKH]?
或仅第一组,即
[DE]
,或仅第二组,即
[RKH]

library(gsubfn)

x <- "DREDRDRDRARDK" # input

rx <- "(([DE][RKH])+[DE]?|([RKH][DE])+[RKH]?|[DE]|[RKH])"
strapply(x, rx)
## [[1]]
## [1] "DRE"    "DRDRDR" "RDK"  
库(gsubfn)

在您的模式中,重复匹配两个字符类中的一个字符,然后是一个肯定的前瞻,它断言应该有一个字符直接出现在右侧

注意不应选择性地重复正向前瞻
(?=[RKH])*
,否则它将始终为真,匹配太多)

如果前视后量词
*
不存在,您将获得缺少字符的匹配项

匹配项缺少每个组的最后一个字母的原因是当匹配了
[DE]
时,有一个正面的前瞻性断言直接在右边的是
[RKH]
(另一种情况是由于交替)

  • 它与
    DRE
    中的
    E
    不匹配,因为在匹配
    E
    时,在is之后的
    [RKH]
    的先行断言为on,但事实并非如此
  • 它与
    drdrdrdr
    中的最后一个
    R
    不匹配,因为最后一个
    R
    后面没有
    A
  • 由于正向前瞻断言应该存在下一个字符,因此您也不匹配最后一个
    K
    ,因为后面没有字符
如前所述,您可以重复匹配字符类对,然后可选地匹配后面的第一个字符类

如果没有这些小组,我认为也可以缩短为:

(?:[DE][RKH])+[DE]?|(?:[RKH][DE])+[RKH]?

输出

[[1]]
[1] "DRE"    "DRDRDR" "RDK" 

在您的模式中,重复匹配2个字符类中的单个字符,然后是一个肯定的前瞻,它断言应该有一个字符直接出现在右侧

注意不应选择性地重复正向前瞻
(?=[RKH])*
,否则它将始终为真,匹配太多)

如果前视后量词
*
不存在,您将获得缺少字符的匹配项

匹配项缺少每个组的最后一个字母的原因是当匹配了
[DE]
时,有一个正面的前瞻性断言直接在右边的是
[RKH]
(另一种情况是由于交替)

  • 它与
    DRE
    中的
    E
    不匹配,因为在匹配
    E
    时,在is之后的
    [RKH]
    的先行断言为on,但事实并非如此
  • 它与
    drdrdrdr
    中的最后一个
    R
    不匹配,因为最后一个
    R
    后面没有
    A
  • 由于正向前瞻断言应该存在下一个字符,因此您也不匹配最后一个
    K
    ,因为后面没有字符
如前所述,您可以重复匹配字符类对,然后可选地匹配后面的第一个字符类

如果没有这些小组,我认为也可以缩短为:

(?:[DE][RKH])+[DE]?|(?:[RKH][DE])+[RKH]?

输出

[[1]]
[1] "DRE"    "DRDRDR" "RDK" 

规则不清楚,你能补充更多的口头澄清吗?规则不清楚,你能补充更多的口头澄清吗?