Regex 我有一个特定的正则表达式,但有一个测试出错了

Regex 我有一个特定的正则表达式,但有一个测试出错了,regex,Regex,我要做的就是为“企鹅”做一个正则表达式 规则如下: 企鹅向右看时用单词Peng表示,向左看时用单词Gnep表示 在每一排中,只有企鹅出现(例如,没有北极熊) 如果企鹅被后续企鹅隐藏,则其单词的后缀将被删除 示例: Pen描述了一只部分隐藏的右眼企鹅 Gn描述了一只被严重隐藏的左眼企鹅 我们只对至少三分之一可见的企鹅感兴趣。其他的都被忽略了。这意味着剩余部分必须至少包含两个字符 一排企鹅是通过连接它们的单词来书写的。两只企鹅排成一行的示例: PengPeng-两只企鹅都清晰可见 GneP

我要做的就是为“企鹅”做一个正则表达式

规则如下:

  • 企鹅向右看时用单词Peng表示,向左看时用单词Gnep表示
  • 在每一排中,只有企鹅出现(例如,没有北极熊)
如果企鹅被后续企鹅隐藏,则其单词的后缀将被删除

示例:

  • Pen
    描述了一只部分隐藏的右眼企鹅
  • Gn
    描述了一只被严重隐藏的左眼企鹅
我们只对至少三分之一可见的企鹅感兴趣。其他的都被忽略了。这意味着剩余部分必须至少包含两个字符

一排企鹅是通过连接它们的单词来书写的。两只企鹅排成一行的示例:

  • PengPeng
    -两只企鹅都清晰可见
  • GnePeng
    -右侧企鹅(Peng)隐藏左侧企鹅(
    Gne
最右边的企鹅是这一排中的最后一只,因此完全可见

每行至少有一只企鹅

我写的表达是:

((P|G)(([eng]|[nep]){1,4}))*((Peng|Gnep)+)
我测试了测试词:

Peng       works    
Gnep       works
Pen        doesnt 
PengPeng     works
PenGnep      works
PPeng       works - shouldnt
Pooh       doesnt
PengPe     works - shouldnt
我需要改变什么?通过Regexr.com完成的测试可以使用

^(?:Pe(?:ng?)?|Gn(?:ep?)?)*(?:Peng|Gnep)$

详细信息

  • ^
    -字符串的开头
  • (?:Pe(?:ng?)| Gn(?:ep?)*
    -零次或多次出现
    • Pe(?:ng?)
      -
      Pe
      后跟可选的
      n
      和可选的
      g
    • |
      -或
    • Gn(?:ep?)
      -
      Gn
      后跟可选出现的
      e
      和可选的
      p
  • (?:Peng | Gnep)
    -要么
    Peng
    要么
    Gnep
    字符串
  • $
    -字符串结束

将字符类与组混淆。请尝试
^(?:Pe(?:ng?)| Gn(?:ep?)*(?:Peng | Gnep)$
,请参阅@WiktorStribiżew,这是有效的。你能解释一下我到底遗漏了什么和困惑了什么吗?@WiktorStribiżew我更感兴趣?:表达。这意味着什么。1)您希望以正确的顺序匹配每个备选方案的可选两个字符,因此,您不能使用像
[nep]{1,3}
这样的字符类,它应该使用组和可选结构来构建,
(?:n(ep?)
)。2)
(?:…)
非常感谢你,Wiktor!干杯