Java 如何限制正则表达式中字符的出现?
我想检查字符串是否仅由字母和数字组成,并允许使用Java 如何限制正则表达式中字符的出现?,java,regex,Java,Regex,我想检查字符串是否仅由字母和数字组成,并允许使用-分隔符: ^[\w\d-]*$ 有效:TEST-TEST123 现在我想检查分隔符一次只出现一次。因此,以下示例应无效: 无效:测试--TEST,测试--TEST,测试--TEST 问题:如何限制字符的重复出现?您可以使用 ^(?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)?$ 或者,在Java中,您可以使用字母数字\p{Alnum}字符类来表示字母和数字: ^(?:\p{Alnum}+(?:-\p{Alnum}+)*)?$
-
分隔符:
^[\w\d-]*$
有效:TEST-TEST123
现在我想检查分隔符一次只出现一次。因此,以下示例应无效:
无效:测试--TEST
,测试--TEST
,测试--TEST
问题:如何限制字符的重复出现?您可以使用
^(?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)?$
或者,在Java中,您可以使用字母数字\p{Alnum}
字符类来表示字母和数字:
^(?:\p{Alnum}+(?:-\p{Alnum}+)*)?$
见
详细信息
-字符串的开头^
-启动可选的非捕获组(它将确保模式匹配空字符串,如果不需要,请删除此组!)(?:
-1个或多个字母或数字\p{Alnum}+
-零次或多次重复(?:-\p{Alnum}+)*
-连字符-
-1个或多个字母或数字\p{Alnum}+
-可选非捕获组的结尾)?
-字符串结束$
匹配
方法中使用模式,则不需要^
和$
锚定,因为默认情况下它锚定匹配:
Boolean valid = s.matches("(?:\\p{Alnum}+(?:-\\p{Alnum}+)*)?");
使用
^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$
^[^\W\]+(?:-[^\W\+)*$
顺便说一句,当您有\W
时,不需要使用\d
,所以^\W+(?:-\W+*$
就可以了