regex Java正则表达式matcher.matches()不适用于正向前瞻模式,我应该使用find()方法吗?

kuhbmx9i  于 2023-06-25  发布在  Java
关注(0)|答案(2)|浏览(115)

我需要一个java正则表达式模式来验证输入字符串:输入可以包含3个或更多的字母,后跟7个或更多的数字。字符的总和应在10到14之间。
我写了一个模式,并测试工作,我意识到这与2节:1个正向先行,检查字符格式(3个或更多字母后跟7个或更多数字)2个正向先行,检查输入字符串的字符长度(以质量为单位)
我的图案:(?=^[A-Z]{3,}[0-9]{7,}$)(?=^[A-Z0-9]{10,14}$)
当我在java8中使用Matcher.matches()时,它不匹配,而如果我使用matcher.find(),它会给我true。
我尝试了这个模式:(?=^[A-Z]{3,}[0-9]{7,}$)(?=^[A-Z0-9]{10,14}$)Matcher.matches(),并期望给予我真,但给我假。
如果我用matcher.find()尝试这个模式,它给我true,但我也有其他模式在使用,并且没有开始和结束符号,所以find()函数为该模式提供true(给出错误的结果),如果输入字符串也包含其他字符(所以我不会使用find,因为其他模式,如果不必要)。
输入应该起作用:ROM1234567 ROMM1234567
输入不应工作:RO1234567 RO123456 ROM123456 ROM123456789012

2cmtqfgy

2cmtqfgy1#

Matcher.matches()检查完整字符串是否与提供的模式匹配。但是你的模式doesn't actually matches anything:lookaheads(和一般的lookarounds)不消耗输入。
您可以使用实际匹配字符串的模式。像这样:

^(?=[A-Z]{3,}[0-9]{7,}$)[A-Z0-9]{10,14}$

^(?=[A-Z]{3,}[0-9]{7,}$)(?=[A-Z0-9]{10,14}$).*

第一个例子here的演示。请注意,它是如何匹配整行的,而不是像您的尝试那样在开始时匹配空字符串。
或者使用matcher.find(),因为它会查找子字符串,并且非常喜欢匹配输入开头的空字符串的模式。

wkftcu5l

wkftcu5l2#

你晚上试着用正则表达式:

^(?=.{10,14}$)[A-Z]{3,}[0-9]{7,}\Z
  1. ^-匹配字符串的开头。
  2. (?.{10,14}$)-字符串包含10到14个非换行字符的肯定前瞻Assert。
  3. [A-Z]{3,}[0-9]{7,}-匹配3个或更多字母,后跟7个或更多数字。
  4. \Z-匹配字符串的结尾。
    请注意,在我使用了\Z而不是$,它也会匹配字符串末尾的换行符,这可能是你不希望作为输入的一部分。也就是说,输入应该只由字母数字字符组成。如果您知道不能输入换行符,或者可以在行尾输入换行符,则使用$

相关问题