Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中带有一个感叹词的多个重复字符_Java_Regex - Fatal编程技术网

Java中带有一个感叹词的多个重复字符

Java中带有一个感叹词的多个重复字符,java,regex,Java,Regex,我正在写一个正则表达式来检查一个字符是否连续重复5次。如果字符重复6次,则第五个字符和第七个字符之间必须存在允许的字符。我可以对一个字符执行此操作,但无法连接多个字符的检查。我应该如何连接 对上述情况的解释: YYYYY->连续5次,所以这是真的 YYYYY HY->6次重复,允许字符在第5次和第6次重复之间,也是真的 我现在的正则表达式: "(.*Y{4}(([LCDH]Y)|Y).*)" // this works fine in meeting the requirement above

我正在写一个正则表达式来检查一个字符是否连续重复5次。如果字符重复6次,则第五个字符和第七个字符之间必须存在允许的字符。我可以对一个字符执行此操作,但无法连接多个字符的检查。我应该如何连接

对上述情况的解释:

YYYYY->连续5次,所以这是真的

YYYYY HY->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
对于第二个表达式,YYYYY-ttttt-qt的一个案例,给了我false(因为ttttt-qt是错误的),但我希望它给我true,因为yyyy是正确的

TTT QT是错误的,因为在第五个和第六个T之间,只能存在D或M。因此,虽然ttt是正确的,但是在第六个T之前,Q的存在使得它是错误的。或者,ttttdt或ttttmt是正确的


我如何确保如果连接多个这样的条件,如果其中一个条件为真,我将得到一个真值?

好的,首先,您使用的是正则表达式,因此不需要将。*固定到每一侧

因此:

(.*Y{4}(([LCDH]Y)|Y).*)|(.*T{4}(([DM]T)|T).*)
变成:

(Y{4}(([LCDH]Y)|Y))|(T{4}(([DM]T)|T))
第二,这对于在任何东西中找到“yyyy”都很有用。。。尽管您可以通过将其缩减为以下内容来缩短它并使其更具可读性:

Y{4}[LCDH]?Y|T{4}[DM]?T
这些或“ed”表达式中的任何一个都应该与“yyyy ttttt qt”匹配,因此我只能假设您没有正确使用正则表达式?

您可以使用:

^(?:Y{5}(?![^HY]Y)|T{5}(?![^DMT]T))[A-Z]*
解释

  • ^
    锚定声明我们位于字符串的开头
  • (?:
    启动包含
    |
    替代项的非捕获组
  • Y{5}
    match 5ys
  • (?![^HY]Y)
    断言这后面不是一个既不是H也不是Y的字符,而是一个Y
  • |
  • T{5}
    match 5 Ts
  • (?![^DMT]T)
    断言这后面没有一个既不是D也不是M也不是T的字符,而是一个T
  • 结束非捕获组
  • [A-Z]*
    匹配任何尾随字符

如果您首先检查它是否重复5次,那么为什么不使用
Y{5}
而不是
{4}
?请更清楚地说明您的要求,这是无法理解的。为什么
ttttqt
是错误的?试试看,如果你这样做,你会得到一个yyyy的假数字。谢谢你的简化。但是我得到了一个false,即使YYYYY在YYYYY ttttqt中。我正在试图找出如何实现,我不确定我们是否应该删除。*条件。*,它的意思是说,在它之前/之后的任何字符都不重要。当我删除它时,我得到了YYYY的假返回。所以我认为应该保留它,这可能是java实现的一个问题。我曾经使用python的re模块尝试过这一点,对我来说效果非常好,所以我只能假设这是一个java问题,我对java正则表达式问题并不十分熟悉。对不起(无需担心,让我思考。*的必要性,更清楚地理解RegExtWeeded和added解释,如果您有问题,请告诉我。:)酷,我明白了。但是yyyy aa返回false。如何修改此选项以接受其他字符?请查看更新的答案,如果更接近,请告诉我。:)差不多了,不过我们也需要在字符串的开头加上[A-Z]*,因为字符可以出现在任何地方^[A-Z]*(?:Y{5}(?[HY]Y){T{5}(?[DMT]T))[A-Z]*