Regex 用于匹配正向参考练习的正则表达式
我正在做一个关于正则表达式正向引用的练习,就像所问的那样 任务是:Regex 用于匹配正向参考练习的正则表达式,regex,Regex,我正在做一个关于正则表达式正向引用的练习,就像所问的那样 任务是: 字符串s由tic或tac tic不应该是它自己的近邻 第一个tic必须在tac之前至少出现两次时发生 我用这个regex来解决它。但是它不使用前向引用,所以我很想知道如何使用它来解决这个问题 ^tac(tac)+(tic(tac)+){0,}(tic)?$ 有效: tactactic tactactictactic tactactictactictictac tactictac 无效: tactactic tactac
- 字符串s由tic或tac
- tic不应该是它自己的近邻
- 第一个tic必须在tac之前至少出现两次时发生
regex
来解决它。但是它不使用前向引用,所以我很想知道如何使用它来解决这个问题
^tac(tac)+(tic(tac)+){0,}(tic)?$
有效:
tactactic
tactactictactic
tactactictactictictac
tactictac
无效:
tactactic
tactactictactic
tactactictactictictac
tactictac
我如何解决这个问题 如果字符串中至少有2个tic,您可以使用负前瞻来断言不存在tic,并从匹配和至少2次
tic开始
^(?!.*tictic)(?:tac){2}tic(?:t[ai]c)*$
如果字符串也只能由1个或多个时间tac组成,则可以使用替代选项:
^(?:(?:tac)+|(?!.*(tictic))(?:tac){2,}tic(?:t[ia]c)*)$
^
字符串的开头
(?:
非捕获组
(?:tac)+
仅重复1+次tac
|
或
(?!*(tictic))
断言右侧的内容不包含tactac
(?:tac){2,}(?:t[ia]c)*
重复2+次tac,然后是tic,并重复tic或tac 0+次,直到字符串结束
)
关闭非捕获组
$
字符串结尾
这个简单的正则表达式应该足够好了,不需要任何环顾四周或标记,因为它们在匹配方面非常昂贵
^tac(tac(?:tic)?)+$
说明:
^tac
-字符串开头为tac
(tac(?:tic)?+
-这匹配tac
,可选地后跟tic
,因此不会同时出现两个tic
,并且由于tic
在这里是可选的,因此它允许根据需要匹配tac
$
-字符串结尾
这使用正向引用:
^(\2tic |(tac))+$
实际上,它与上给出的示例非常相似。TactActic
不应该有效吗?你们都是对的。注意两种模式。请检查谢谢您的回答,但您是否也可以容纳转发参考
(但不能以冗余方式)@greeny1234:对不起,我不确定您称之为转发参考
。你的意思是积极向前看吗?我在问题中添加了一个链接,没有完全理解关于和的部分,但是你能展示一个涉及转发参考的链接吗?谢谢你。我一直在尝试如何使用前向引用
来解决这个问题,这是因为您自己的正则表达式无法匹配开始时有两个以上tac
s的字符串,例如tactActic
。您已经得到了答案,但为了提高性能,您应该选择一个更轻的正则表达式:^(tac)(\1+tic)+\1*$
@revo这也是一个很好的解决方案,为什么不发布它呢?@Thefourthbird我觉得它没有回答这个问题,因为OP明确要求一个包含已给出的正向引用的解决方案。@revo您是对的,我想这次演习没有足够的案例。你的也很好用。