正则表达式。只有一个点

时间:2016-06-01 10:10:22

标签: java regex

我试图写一个正则表达式:

Pattern pattern2 = Pattern.compile("^([a-zA-Z0-9_'.-]{2,15})$");
Matcher matcher2 = pattern2.matcher(username); 
它应该做的是:

- all letters are allowed
- all digit are allowed
- symbols such as _'- are allowed

我想补充说只允许使用一个点。

user.name      ok
use.rna.me     not ok

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

您可以通过在开头处锚定的前瞻来实现这一目标:

"^(?=[^.]*\\.[^.]*$)[a-zA-Z0-9_'.-]{2,15}$"
  ^^^^^^^^^^^^^^^^^^

此外,您可以使用\w代替[a-zA-Z0-9_](如果您不添加(?U)内联修饰符或Pattern.UNICODE_CHARACTER_CLASS标记):

"^(?=[^.]*\\.[^.]*$)[\\w'.-]{2,15}$"

但是,上面的模式将需要字符串中的1个点。 如果不需要点,请反转要求:如果存在2个点,则匹配失败:

"^(?![^.]*\\.[^.]*\\.)[\\w'.-]{2,15}$"
  ^^^^^^^^^^^^^^^^^^^^ 

模式详情

  • ^ - 字符串开头
  • (?![^.]*\\.[^.]*\\.) - 如果从一开始就有{+ 1}}以外的其他0个字符,那么匹配失败的否定前瞻,接着是.,然后是.以外的0 +字符1}}从一开始,然后是.(请注意,这可以缩短为.)。
  • (?!(?:[^.]*\\.){2} - 2到15个字符,或者是第一个字([\\w'.-]{2,15})或
  • [a-zA-Z0-9_]或连字符
  • . - 字符串结束。

答案 1 :(得分:1)

你可以用

来做
^(?=.{2,15}$)[\w-']*\.?[\w-']*$

首先,它确保整个表达式长度为2-15个字符,具有正向前瞻。然后它匹配任意数量的word character s(a-zA-Z0-9_),然后是可选点,然后再跟随任意数量的word character。锚点(^ - 行首,$ - 行尾)确保不存在任何其他内容。

答案 2 :(得分:1)

您可以尝试否定前瞻

    String p = "use.rname";
    System.out.println(p.matches("(?!.*?\\..*?\\..*)([a-zA-Z0-9_'.-]{2,15})"));

O / P:

"use.rname" ==> true
"use.rname.xyz" ==> false