Java 正则表达式。只有一点

Java 正则表达式。只有一点,java,regex,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

我正在尝试编写一个正则表达式:

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

非常感谢你的帮助

您可以通过在开始处锚定前瞻来实现这一点:

"^(?=[^.]*\\.[^.]*$)[a-zA-Z0-9_'.-]{2,15}$"
  ^^^^^^^^^^^^^^^^^^
此外,您可以使用
\w
而不是
[a-zA-Z0-9\]
(如果您不添加
(?U)
内联修饰符或
模式.UNICODE字符类
标志):

但是,上面的模式要求字符串中有1个点如果不需要点,则反向要求:如果存在两个点,则匹配失败:

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

  • ^
    -字符串的开头
  • (?![^.]*\..[^.]*\...[^.]*\..
    )-如果开头有0+个字符而不是
    ,则匹配失败的负前瞻,然后从开头再加上一个
    (请注意,这可以缩短为
    (?!(?:[^.]*\\.
    ){2})
  • [\\w.-]{2,15}
    -2到15个字符,一个单词(
    [a-zA-Z0-9\
    )或
  • 或连字符
  • $
    -字符串结束

您可以通过在开始处锚定前瞻来实现这一点:

"^(?=[^.]*\\.[^.]*$)[a-zA-Z0-9_'.-]{2,15}$"
  ^^^^^^^^^^^^^^^^^^
此外,您可以使用
\w
而不是
[a-zA-Z0-9\]
(如果您不添加
(?U)
内联修饰符或
模式.UNICODE字符类
标志):

但是,上面的模式需要字符串中有一个点。如果不需要一个点,则颠倒要求:如果有两个点,则匹配失败:

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

  • ^
    -字符串的开头
  • (?![^.]*\..[^.]*\...[^.]*\..
    )-如果开头有0+个字符而不是
    ,则匹配失败的负前瞻,然后从开头再加上一个
    (请注意,这可以缩短为
    (?!(?:[^.]*\\.
    ){2})
  • [\\w.-]{2,15}
    -2到15个字符,一个单词(
    [a-zA-Z0-9\
    )或
  • 或连字符
  • $
    -字符串结束
    • 你可以用

      ^(?=.{2,15}$)[\w-']*\.?[\w-']*$
      
      首先,它确保整个表达式的长度为2-15个字符,并具有积极的前瞻性。然后它匹配任意数量的
      单词字符(
      a-z
      a-z
      0-9
      ),后跟一个可选的点,再后跟任意数量的
      单词字符
      s。锚定(
      ^
      -行的开始,
      $
      -行的结束)确保没有其他内容。

      您可以使用

      ^(?=.{2,15}$)[\w-']*\.?[\w-']*$
      
      首先,它确保整个表达式的长度为2-15个字符,并具有积极的前瞻性。然后它匹配任意数量的
      单词字符(
      a-z
      a-z
      0-9
      ),后跟一个可选的点,再后跟任意数量的
      单词字符
      s。锚定(
      ^
      -行的开始,
      $
      -行的结束)确保不存在任何其他内容。

      您可以尝试反向前瞻

      O/p:

      你可以试试消极的前瞻

      O/p:


      对于{2,15}我的意思是用户名必须大于2,小于15,对于{2,15}我的意思是用户名必须大于2,小于15。看起来我已经完成了。如果有任何不清楚或遗漏,请随时ping我。可以使用正则表达式演示。此外,我将使用
      \\A
      而不是
      ^
      \\z
      而不是真正的代码中的
      $
      。此外,值得注意的是,尽管在字符类的结尾不必转义,有些人说,如果其他不太懂正则表达式的开发人员将来支持正则表达式,转义它仍然是一个好主意。看起来我已经完成了。如果有任何不清楚或缺少的地方,请随时ping我。可以使用正则表达式演示。此外,我将使用
      \\a
      而不是
      ^
      \\z
      而不是实际代码中的
      $
      。此外,值得注意的是,尽管字符类末尾的连字符不必转义,但有些人说,如果其他不太懂正则表达式的开发人员将来会支持正则表达式,那么转义它仍然是一个好主意。