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

时间:2017-08-19 07:17:56

标签: java regex

我希望有正则表达式来检查输入字符a-z0-9但我不想允许输入只是数字值(必须至少有一个字母字符)< / p>

例如:

413123123123131

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

[0-9]*[a-z].*

但是现在我很困惑如何定义{x,y}短语的长度我想要{9,31}但是在最后*之后我也不能有长度块我试图定义组但不幸而不是工作

https://www.debuggex.com/

进行了测试


如何添加???

4 个答案:

答案 0 :(得分:4)

您寻求的是

String regex = "(?=.{9,31}$)\\p{Alnum}*\\p{Alpha}\\p{Alnum}*";

将其与String#matches() / Pattern#matches()方法一起使用,以要求完整字符串匹配:

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

<强>详情

  • ^ - 隐含在matches()中 - 匹配字符串的开头
  • (?=.{9,31}$) - 一个积极的预测,除了从字符串的开头到结尾的换行符之外,需要9到31个字符
  • \\p{Alnum}* - 0个或更多字母数字字符
  • \\p{Alpha} - ASCII字母
  • \\p{Alnum}* - 0个或更多字母数字字符

Java demo

String lines[]  = {"413123123123131", "4131231231231a"};
Pattern p = Pattern.compile("(?=.{9,31}$)\\p{Alnum}*\\p{Alpha}\\p{Alnum}*");
for(String line : lines)
{
    Matcher m = p.matcher(line);
    if(m.matches()) {
        System.out.println(line + ": MATCH");
    } else {
        System.out.println(line + ": NO MATCH");
    }
}

输出:

413123123123131: NO MATCH
4131231231231a: MATCH

答案 1 :(得分:2)

这可能就是你要找的东西。

[0-9a-zA-Z]*[a-zA-Z][0-9a-zA-Z]* 

为了帮助解释它,可以将中间词视为一个必需字符,将外部术语视为任意数量的字母数字字符。

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

if (str.length > 9 && str.length < 31)

Wiktor确实提供了一个涉及更多正则表达式的解决方案,请查看他的更好的正则表达式

答案 2 :(得分:1)

试试这个正则表达式:

^(?:(?=[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}$

Demo

解释(对于第一个正则表达式):

  • ^ - 字符串开头前的位置
  • (?=[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)

答案 3 :(得分:0)

这是正则表达式:

[a-zA-Z\d]*[a-zA-Z][a-zA-Z\d]*

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

但是,您需要使用length检查字符串的长度,而不是使用正则表达式。我无法想到你如何在正则表达式中做到这一点。

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

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;
}