Java 短语的正则表达式包含文字和数字,但并非所有短语都是一个仅具有固定范围长度的数字

Java 短语的正则表达式包含文字和数字,但并非所有短语都是一个仅具有固定范围长度的数字,java,regex,Java,Regex,我想用正则表达式检查输入字符a-z和0-9,但我不想只允许输入数字值,必须至少有一个字母字符 例如: 413123131 不允许,但如果在短语的任何位置只有一个字母字符,就可以了 我试图为它定义正确的正则表达式,最后我提出了 [0-9]*[a-z]* 但在现在,我搞不清楚如何定义短语的{x,y}长度,我想有{9,31},但在最后*我也不能有长度块,我试图定义组,但不幸的是,没有工作 测试时间 我如何添加它???这可能就是您要找的 [0-9a-zA-Z]*[a-zA-Z][0-9a-zA-Z]*

我想用正则表达式检查输入字符a-z和0-9,但我不想只允许输入数字值,必须至少有一个字母字符

例如:

413123131 不允许,但如果在短语的任何位置只有一个字母字符,就可以了 我试图为它定义正确的正则表达式,最后我提出了

[0-9]*[a-z]* 但在现在,我搞不清楚如何定义短语的{x,y}长度,我想有{9,31},但在最后*我也不能有长度块,我试图定义组,但不幸的是,没有工作

测试时间


我如何添加它???

这可能就是您要找的

[0-9a-zA-Z]*[a-zA-Z][0-9a-zA-Z]* 
为了帮助解释它,可以将中间项看作是您所需的一个字符,将外部项看作任意数量的字母数字字符

编辑:要限制字符串作为一个整体的长度,您可能需要在匹配后手动检查。即

if (str.length > 9 && str.length < 31)
Wiktor确实提供了一个涉及更多正则表达式的解决方案,请查看his以获得更好的正则表达式模式

以下是正则表达式:

[a-zA-Z\d]*[a-zA-Z][a-zA-Z\d]*
这里的诀窍是拥有一些非可选的东西。前导和尾随[a-zA-Z\d]有一个*量词,因此它们是可选的。但是[AZ-Z]中间没有可选的。字符串必须具有与[a-zA-Z]匹配的字符才能匹配

但是,您需要在以后使用length检查字符串的长度,而不是使用regex。我想不出任何办法,你怎么能在regex里做到这一点

实际上,我认为你可以很容易地做到这一点:

private static boolean matches(String input) {
    for (int i = 0 ; i < input.length() ; i++) {
        if (Character.isLetter(input.charAt(i))) {
            return input.length() >= 9 && input.length() <= 31;
        }
    }
    return false;
}
你所寻求的是

String regex = "(?=.{9,31}$)\\p{Alnum}*\\p{Alpha}\\p{Alnum}*";
将其与Stringmatches/Patternmatches方法一起使用以要求完全字符串匹配:

if (s.matches(regex)) {
    return true;
}
细节

^-在匹配中隐式-匹配字符串的开头 ?=.{9,31}$-一个正向前瞻,从字符串的开始到结束需要9到31个字符,而不是换行字符 \\p{Alnum}*-0个或多个字母数字字符 \\p{Alpha}-一个ASCII字母 \\p{Alnum}*-0个或多个字母数字字符 :

输出:

413123123123131: NO MATCH
4131231231231a: MATCH
试试这个正则表达式:

^(?:(?=[a-z])[a-z0-9]{9,31}|(?=\d.*[a-z])[a-z0-9]{9,31})$
或者更简短一点:

^(?:(?=[a-z])|(?=\d.*[a-z]))[a-z0-9]{9,31}$
第一个正则表达式的解释:

^-字符串开始前的位置 ?=[a-z][a-z0-9]{9,31}表示如果字符串以字母开头,则匹配字母和数字。最小值为9,最大值为31 |-或 ?=\d.[a-z][a-z0-9]{9,31}表示如果字符串以数字开头,后跟字符串中的某个字母,则匹配字母和数字。最少9个,最多31个。这还可以确保,如果字符串以数字开头,并且字符串中的任何位置都没有字母,则不会有任何匹配 $-字符串最后一个文本后的位置 输出:

413123123123131                                        NO MATCH(no alphabets)
kjkhsjkf989089054835werewrew65                         MATCH 
kdfgfd4374985794379857984379857weorjijuiower           NO MATCH(length more than 31)
9087erkjfg9080980984590p465467                         MATCH 
4131231231231a                                         MATCH
kjdfg34                                                NO MATCH(Length less than 9)

让我们精确一点:您是否允许任何字符,或者只允许字母数字ASCII字符?请检查此项。请注意\w与数字、字母或\匹配。您拥有的正则表达式也匹配所有数字。另外,[\w\d]=\w,因此,您的正则表达式与\w*\w\w*相同。谢谢@WiktorStribiżew!是的,我会编辑它。现在看起来不错。顺便说一句,也可以使用正向前瞻检查字符串长度。谢谢你们的回答,但直到我详细的问题是,我想做所有的正则表达式,而不是两部分控制。你能在你的regext短语中定义{x,y}吗?@javaacm看到我的答案了。谢谢,但我选择接受kira的答案,因为他们的答案和以前一样有效,他早些时候作为评论回答了我认为这是公平的,我以1票赞成,因为你的答案也是正确的,而且有效。当你确定答案是正确的,就把它作为答案而不是评论,谢谢兄弟
413123123123131                                        NO MATCH(no alphabets)
kjkhsjkf989089054835werewrew65                         MATCH 
kdfgfd4374985794379857984379857weorjijuiower           NO MATCH(length more than 31)
9087erkjfg9080980984590p465467                         MATCH 
4131231231231a                                         MATCH
kjdfg34                                                NO MATCH(Length less than 9)