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}+)*)?$

详细信息

  • ^
    -字符串的开头
  • (?:
    -启动可选的非捕获组(它将确保模式匹配空字符串,如果不需要,请删除此组!)
    • \p{Alnum}+
      -1个或多个字母或数字
    • (?:-\p{Alnum}+)*
      -零次或多次重复
      • -
        -连字符
      • \p{Alnum}+
        -1个或多个字母或数字
  • )?
    -可选非捕获组的结尾
  • $
    -字符串结束
在代码中,如果在
匹配
方法中使用模式,则不需要
^
$
锚定,因为默认情况下它锚定匹配:

Boolean valid = s.matches("(?:\\p{Alnum}+(?:-\\p{Alnum}+)*)?");

使用
^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$
^[^\W\]+(?:-[^\W\+)*$
顺便说一句,当您有
\W
时,不需要使用
\d
,所以
^\W+(?:-\W+*$
就可以了