Java 正则表达式需要一个字母表和一个非字母表,并且没有空格
我想在Java中创建一个正则表达式来匹配至少1个字母表,1个非字母表可以是除a-Za-z之外的任何东西,并且没有空格 下面的正则表达式部分正确:Java 正则表达式需要一个字母表和一个非字母表,并且没有空格,java,regex,Java,Regex,我想在Java中创建一个正则表达式来匹配至少1个字母表,1个非字母表可以是除a-Za-z之外的任何东西,并且没有空格 下面的正则表达式部分正确: ^([A-Za-z]{1,}[^A-Za-z]{1,})+$ 它与AA7777相匹配 但与777aaaaa不匹配 任何帮助都将不胜感激。您可以使用 s.matches("(?=\\P{Alpha}*\\p{Alpha})(?=\\p{Alpha}*\\P{Alpha})\\S*") 细节 模式将匹配整个字符串,因为^和\z锚点在匹配中是隐式的 ?
^([A-Za-z]{1,}[^A-Za-z]{1,})+$
它与AA7777相匹配
但与777aaaaa不匹配
任何帮助都将不胜感激。您可以使用
s.matches("(?=\\P{Alpha}*\\p{Alpha})(?=\\p{Alpha}*\\P{Alpha})\\S*")
细节
模式将匹配整个字符串,因为^和\z锚点在匹配中是隐式的
?=\p{Alpha}*\p{Alpha}-在任何0+字符(ASCII字母除外)之后至少需要一个ASCII字母的前瞻
?=\p{Alpha}*\p{Alpha}-在0个或多个ASCII字母之后需要除ASCII字母以外的字符的一种前瞻
\S*-零个或多个非空白字符。
要使正则表达式能够识别Unicode,请将\p{Alpha}替换为\p{L},将\p{Alpha}替换为\p{L}。您的正则表达式隐式假定要匹配的字符顺序。regex说一封信必须在非后者之前。但是,您希望字母和非字母以任意顺序出现,因此您需要考虑这两种情况。还请注意,它应该是[^\sa-zA-Z],而不是[^a-zA-Z],因为不允许使用空格
(?:[a-zA-Z][^\sa-zA-Z]|[^\sa-zA-Z][a-zA-Z])
在开始和结束处,允许使用任何非空格字符,因此:
^\S*(?:[a-zA-Z][^\sa-zA-Z]|[^\sa-zA-Z][a-zA-Z])\S*$
正则表达式不是这种类型验证的合适工具。只要写出简单的逻辑,你的具体例子: 公共班机{ 公共静态无效字符串[]args{ System.out.println'foo'?+doesMatchfoo; System.out.println'bar7'?+doesMatchbar7; System.out.println'55baz'?+Doesmach55Baz; } 公共静态布尔doesMatchString输入{ 布尔hasAlpha=false, hasNonAlpha=假; forchar ch:input.TOCHARRAY{
ifch>='a'&&ch='a'&&ch?s^?=\\P{Alpha}*\\P{Alpha}?=\\P{Alpha}*\\P{Alpha}.+$对不起,\\P{Alpha}与字母匹配,\P{Alpha}匹配非字母。它不起作用。如果您在使用在线测试仪时遇到问题,我会在Java测试中进行测试。在JS正则表达式测试仪中测试Java正则表达式没有什么意义,因为正则表达式引擎非常不同。我根据问号提供了Java解决方案。@Abhishek我刚刚注意到您想要匹配一个没有空格的字符串。我更新了答案以解释此问题。先前允许字符串中任何字符的变体位于中。