regex 两个捕获组中的模式按预期工作,但在放入反向引用时失败

6mzjoqzu  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(80)

我写了一个正则表达式,它应该匹配一个只包含可选字符的模式,但同时我希望它不匹配一个空字符串-我想我将使用反向引用,但当我试图应用它时,我的检查停止工作:可能我对反向引用缺乏理解,但请给予我一个提示,我在哪里犯了一个错误,我正则表达式:

(?<pat>^[10]+$)(\k<pat>0*(1(10)*(0|(11))((01*0)(01)*1|(00))*1)*0*)

两个子模式均已应用-无匹配项-无论正确与否

仅应用第二个模式(附加锚点检查-所有正确匹配均有效,但也匹配空行

仅应用第一个模式:匹配1和0的任意组合

还有,我还有一个次要问题:如果我使用反向引用,我可以使用锚点^$来检查第一组匹配的整个模式是否在反向引用中匹配吗?

Those should match:
101
000
1010
10100
Those should NOT match (empty string in first row):

101110101
1110001
1000
11

和模式:

^[10]+$
^0*(1(10)*(0|(11))((01*0)(01)*1|(00))*1)*0*$
(?<pat>^[10]+$)(\k<pat>0*(1(10)*(0|(11))((01*0)(01)*1|(00))*1)*0*)
b4lqfgs4

b4lqfgs41#

在您的模式中,(?<pat>^[10]+$)后跟\k<pat>,它与命名组pat所捕获的字符相匹配。
但是,由于您只匹配01,并且您有一个Assert字符串结尾的锚$,因此在它之后没有更多的文本要通过反向引用进行匹配。
由于您不想匹配空字符串,因此可以将模式编写为:

^(?<pat>0*(1(10)*(0|11)(01*0(01)*1|00)*1)+0*|0+)$

说明

  • ^字符串开头
  • 命名组
  • 0*匹配可选零
  • (开始要作为整体部分重复的组
  • 1(10)*(0|11)(01*0(01)*1|00)*1初始模式
  • )+关闭组并重复此部分1次或多次以防止匹配空字符串
  • 0*匹配可选零
  • |
  • 0+匹配1+乘以零以防止匹配空字符串
  • 关闭组
  • $字符串结束

请参见regex demo

请注意,我已经删除了一些外部捕获组,如(11)(00)(01*0),这些捕获组仅对匹配不必要。

如果只对命名组 pat 感兴趣,则可以使用非捕获组(?:

^(?<pat>0*(?:1(?:10)*(?:0|11)(?:01*0(?:01)*1|00)*1)+0*|0+)$

相关问题