用于用户名验证的正则表达式模式。

3
我正在尝试编写一个正则表达式模式,以验证我们帐户创建 PowerShell 脚本中的用户名格式。我们的用户名格式为 FirstName.LastName。我们接受连字符、撇号和数字,但只接受以下格式:
名字 - 仅限字母、连字符和撇号。
姓氏 - 接受字母数字、连字符和撇号。
以下正则表达式似乎可以工作,但它无法处理以撇号/连字符开头或结尾的用户名,因为这些是有效字符。
"^[a-zA-Z]+-*'*[a-zA-Z]+\.[a-zA-Z]+-*'*[0-9a-zA-Z]+$"

我该如何修改上述内容以确保字符串不匹配,如果它以撇号或连字符开头或结尾?我还想将连字符和撇号限制为每个名字部分中只有一个连续的(例如,“sh-aun”而不是“sha--un”,“sh'aun”而不是“sh''aun”)。
任何帮助都将不胜感激。提前致谢。
2个回答

1
你在第一个字符集中同时使用了连字号和撇号,这使得它可以匹配以这些字符开头的单词。下面的字符集应该可以正常工作。
^[a-zA-Z]+-?'?[a-zA-Z]+\.[0-9a-zA-Z]+-?'?[a-zA-Z]+$

? 允许引擎匹配前面的标记出现零次或一次


1
  • 默认情况下,PowerShell的正则表达式匹配不区分大小写,因此[a-z]足以匹配小写和大写字母。

  • [a-z]仅匹配ASCII(非重音)字母; 如果还要允许重音字母,请改用\p{L}

为了允许名字中有多个-'(但不能在开头或结尾,并且不能连续):

"^[a-z]+(?:[-'][a-z]+)*\.[a-z]+(?:[-'][a-z0-9]+)*$"
  • For an explanation of this regex and interactive experimentation with it, see this regex101.com page.

  • Example:

    # -> $true
    "shaun.o'brien-Thompson" -match "^[a-z]+(?:[-'][a-z]+)*\.[a-z]+(?:[-'][a-z0-9]+)*$"
    

为了仅允许一个(内部的)-',请将*替换为?:
"^[a-z]+(?:[-'][a-z]+)?\.[a-z]+(?:[-'][a-z0-9]+)?$"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接