Java风格的正则表达式:如果组为n个字符,则匹配整个字符串
我正在尝试为字符串验证器创建一个正则表达式。我的字符串长度必须正好为8个字符,并且以字母(小写或大写)或数字开头。它只能在第一个字符后面包含字母(小写和大写)、数字或空格。如果找到一个空格,则后面只能有空格 现在,我有第二部分的匹配组:Java风格的正则表达式:如果组为n个字符,则匹配整个字符串,java,regex,Java,Regex,我正在尝试为字符串验证器创建一个正则表达式。我的字符串长度必须正好为8个字符,并且以字母(小写或大写)或数字开头。它只能在第一个字符后面包含字母(小写和大写)、数字或空格。如果找到一个空格,则后面只能有空格 现在,我有第二部分的匹配组:[a-zA-Z0-9]{1,}\s* 我找不到一种方法来指定此组只有在正好有8个字符时才匹配。我尝试了^([a-zA-Z0-9]{1,}\s*){8}$,但这不是预期的结果 下面是一些测试用例(带有尾随空格) 有效: 9013 20130 89B
[a-zA-Z0-9]{1,}\s*
我找不到一种方法来指定此组只有在正好有8个字符时才匹配。我尝试了^([a-zA-Z0-9]{1,}\s*){8}$
,但这不是预期的结果
下面是一些测试用例(带有尾随空格)
有效:
9013
20130
89B
A5000000
9013
20130
90 90
123456789
无效:
9013
20130
89B
A5000000
9013
20130
90 90
123456789
可能有一种聪明的正则表达式方法可以做到这一点,但您也可以首先检查字符串的长度:
input.length() == 8 && input.matches("[a-zA-Z0-9]+\\s*")
这也可能比复杂的正则表达式更有效。可能有一种智能正则表达式方法,但您也可以先检查字符串的长度:
input.length() == 8 && input.matches("[a-zA-Z0-9]+\\s*")
这也可能比复杂的正则表达式更有效。您可以使用这个基于前瞻性的正则表达式:
^[a-zA-Z0-9](?!.* [a-zA-Z0-9])[a-zA-Z0-9 ]{7}$
在开始时匹配alpha-num字符^[a-zA-Z0-9]
为负前瞻,以确保没有后跟空格的alpha-num字符实例(?!.[a-zA-Z0-9])
匹配包含alpha-num字符或空格的7个字符[a-zA-Z0-9]{7}$
^[a-zA-Z0-9](?!.* [a-zA-Z0-9])[a-zA-Z0-9 ]{7}$
在开始时匹配alpha-num字符^[a-zA-Z0-9]
为负前瞻,以确保没有后跟空格的alpha-num字符实例(?!.[a-zA-Z0-9])
匹配包含alpha-num字符或空格的7个字符[a-zA-Z0-9]{7}$
9013
只有4个字符长的有效输入是什么?如果字符串长度必须正好是8个字符,那么9013为什么有效,20130和89B有效吗?@anubhava结尾处有4个空格,因为您在前面检查了长度,所以可以将{1,8}
更改为+
。我认为没有任何“智能”正则表达式可以击败解耦全局长度和序列要求的简单性。不幸的是,我使用的是现成的企业“工具”(spring batch tasklet),它只能将正则表达式作为参数。否则,您的解决方案会更简单,无论如何,谢谢!因为您之前检查了长度,所以您可以将{1,8}
更改为+
。我不认为有任何“智能”正则表达式,它可以击败解耦合全局长度和序列要求的简单性。不幸的是,我使用的是开箱即用的企业“工具”(spring batch tasklet),它只能以正则表达式作为参数。否则,您的解决方案会更容易,无论如何,谢谢!