我正在写一个正则表达式来检查一个字符是否连续重复5次。如果字符重复6次,则必须存在第五个和第七个字符之间的允许字符。我可以为一个字符执行此操作,但无法连接多个字符的检查。我该如何连接?
上述说明:
YYYYY - >连续5次,所以这是真的
YYYYYHY - > 6次重复,在第5次和第6次重复之间允许使用,也是如此
我当前的正则表达式:
"(.*Y{4}(([LCDH]Y)|Y).*)" // this works fine in meeting the requirement above
"(.*Y{4}(([LCDH]Y)|Y).*)|(.*T{4}(([DM]T)|T).*)" // this does not work fine
对于第二个表达式,一个YYYYYYTTTTTT的情况,给我假(因为TTTTTQT错了)但我希望它给我真实,因为YYYYY是正确的。
TTTTTQT错误,因为在第五和第六T之间,只能存在D或M.因此,虽然TTTTT是正确的,但在此之后和第六次T之前存在Q使其成为错误。或者,TTTTTDT或TTTTTMT是正确的。
我如何确保如果连接多个这样的条件,如果其中一个是真的,我会得到一个真的
答案 0 :(得分:1)
好的,首先你要使用正则表达式,所以你不需要为每一方都添加*。
所以这个:
(.*Y{4}(([LCDH]Y)|Y).*)|(.*T{4}(([DM]T)|T).*)
变为:
(Y{4}(([LCDH]Y)|Y))|(T{4}(([DM]T)|T))
其次,这应该适用于在任何地方找到'YYYYY'...尽管你可以缩短并通过将其缩小为更具可读性来实现:
Y{4}[LCDH]?Y|T{4}[DM]?T
这些或者表达式中的任何一个都应该匹配'YYYYYTTTTTT',所以我只能假设你没有正确使用正则表达式吗?
答案 1 :(得分:1)
您可以使用:
^(?:Y{5}(?![^HY]Y)|T{5}(?![^DMT]T))[A-Z]*
<强>解释强>
^
锚点断言我们位于字符串的开头(?:
启动包含|
更改Y{5}
匹配5 Ys (?![^HY]Y)
声称没有一个字符既不是H也不是Y而是Y |
或T{5}
匹配5 Ts (?![^DMT]T)
声称这不是一个既不是D也不是M也不是T而是T )
结束非捕获组[A-Z]*
匹配任何尾随字符