我写了一个正则表达式,它应该匹配一个只包含可选字符的模式,但同时我希望它不匹配一个空字符串-我想我将使用反向引用,但当我试图应用它时,我的检查停止工作:可能我对反向引用缺乏理解,但请给予我一个提示,我在哪里犯了一个错误,我正则表达式:
(?<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*)
1条答案
按热度按时间b4lqfgs41#
在您的模式中,
(?<pat>^[10]+$)
后跟\k<pat>
,它与命名组pat
所捕获的字符相匹配。但是,由于您只匹配
0
或1
,并且您有一个Assert字符串结尾的锚$
,因此在它之后没有更多的文本要通过反向引用进行匹配。由于您不想匹配空字符串,因此可以将模式编写为:
说明
^
字符串开头0*
匹配可选零(
开始要作为整体部分重复的组1(10)*(0|11)(01*0(01)*1|00)*1
初始模式)+
关闭组并重复此部分1次或多次以防止匹配空字符串0*
匹配可选零|
或0+
匹配1+乘以零以防止匹配空字符串$
字符串结束请参见regex demo。
请注意,我已经删除了一些外部捕获组,如
(11)
、(00)
和(01*0)
,这些捕获组仅对匹配不必要。如果只对命名组 pat 感兴趣,则可以使用非捕获组
(?:
: