我试图写一个正则表达式:
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
非常感谢你的帮助!
答案 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-z
,A-Z
,0-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