在Java中使用一个插入的正则表达式多个重复字符

时间:2014-07-14 23:28:06

标签: java regex

我正在写一个正则表达式来检查一个字符是否连续重复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是正确的。

我如何确保如果连接多个这样的条件,如果其中一个是真的,我会得到一个真的

2 个答案:

答案 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
  • 的char
  • )结束非捕获组
  • [A-Z]*匹配任何尾随字符