为非陷阱群体构建条件

时间:2018-04-10 17:31:07

标签: regex

在以下 RegEx

((this)|(that))-((?(2)these|(?(3)those)))

我接受以下两种情况之一:

  • 此-这些
  • 该-那些

this-these 我得到数组

Array ( 
    [0] => this-these 
    [1] => this 
    [2] => this 
    [3] => 
    [4] => these 
) 

对于那些我得到的数组

Array ( 
    [0] => that-those 
    [1] => that 
    [2] => 
    [3] => that 
    [4] => those 
) 

数组类似于被捕获的群组,我想要的是仅捕获thesethose的群组,我不想将任何其他群组拉到得到数组:

this-these 的情况:

Array ( 
    [0] => this-these 
    [1] => these 
) 

那些

的情况
Array ( 
    [0] => that-those 
    [1] => those 
) 

我尝试的是以下 RegEx

(?:(this)|(that))-(?:(?(1)(these)|(?(2)(those))))

但得到了数组

Array ( 
    [0] => that-those 
    [1] => 
    [2] => that 
    [3] => 
    [4] => those 
) 

然后尝试 RegEx

(?:(?:this)|(?:that))-((?(1)(?:these)|(?(2)(?:those))))

哪个是假的,因为(1), (2)的组不存在。

如何捕获非捕获组以对其应用条件或仅捕获我想要的组。

Additonal Case将是:

this-in-these
this-on-those

that-at-those
that-as-these

1 个答案:

答案 0 :(得分:1)

毕竟,看起来你甚至不需要任何条件结构,也不需要后视。

您正在寻找分组构造,捕获和非捕获组合的组合:

(?:this-[io]n|that-a[ts])-(these|those)

请参阅regex demo

(?:this-[io]n|that-a[ts])-(these|those)

  • (?:this-[io]n|that-a[ts]) - 匹配this-inthis-onthat-atthat as(由于非捕获组 { {1}})
  • (?:...) - 连字符
  • - - 捕获第1组:(these|those)these

您的原始问题可以通过后视来解决:

those

this regex demo。但是,如果(?:this|that)-((?<=this-)these|those) this模式可能不同,正则表达式可能不起作用,因为大多数正则表达式引擎不支持未知宽度的后观模式,除非您在最新的Chrome中使用.NET或JavaScript版本,或Python中的PyPi正则表达式。

此处,that非捕获组与(?:this|that)this匹配,然后匹配连字符,如果当前位置为,则that被捕获到组1中以these开头,否则this-被捕获。