我正在进行正则表达式前向引用的练习,就像被问到的here
任务是:
我已使用此regex
来解决它。但是它不使用forward reference
,所以我真的很想知道如何使用它来解决这个问题。
^tac(tac)+(tic(tac)+){0,}(tic)?$
有效:
tactactic
tactactictactic
无效:
tactactictactictictac
tactictac
如何解决此问题?
答案 0 :(得分:2)
如果字符串中至少应包含2个抽动,您可以使用否定的前行断言不存在抽动,并通过匹配并至少进行2次tic
^(?!.*tictic)(?:tac){2}tic(?:t[ai]c)*$
如果该字符串也只能包含1个或多个tac,则可以使用交替形式:
^(?:(?:tac)+|(?!.*(tictic))(?:tac){2,}tic(?:t[ia]c)*)$
^
字符串的开头(?:
非捕获组
(?:tac)+
仅重复tac 1次以上|
或(?!.*(tictic))
断言右边的内容不含tactac (?:tac){2,}(?:t[ia]c)*
重复tac 2次以上,然后是tic,并重复tic或tac 0+次,直到字符串结尾)
关闭非捕获组$
字符串结尾答案 1 :(得分:2)
这个简单的正则表达式应该足够好,没有环顾四周或贪婪的贪婪令牌,因为它们在匹配方面非常昂贵。
^tac(tac(?:tic)?)+$
说明:
^tac
-以tac
开头的字符串(tac(?:tic)?)+
-这与tac
匹配,并可选地跟着tic
,因此不会再出现两个tic
,并且由于tic
是可选的,因此,它可以根据需要匹配tac
多次以匹配模式。$
-字符串结尾答案 2 :(得分:2)