gpt4 book ai didi

c# - 名字的正则表达式

转载 作者:太空狗 更新时间:2023-10-30 01:29:36 26 4
gpt4 key购买 nike

我对正则表达式很陌生,需要满足以下条件的名字的正则表达式:

  • 名字只能包含字母。它可能包含空格、连字符或撇号。
  • 必须以字母开头。
  • 所有其他字符和数字均无效。
  • 特殊字符 不能在一起(例如不允许使用 John’-s)
  • 在特殊字符 之前和之后应该有一个字母表(例如,不允许使用 John s)
  • 不允许使用两个连续的空格(例如,不允许使用 Annia St)

  • 任何人都可以帮忙吗?我试过这个 ^([a-z]+['-]?[ ]?|[a-z]+['-]?)*?[a-z]$ 但它没有按预期工作。

    最佳答案

    正则表达式是出了名的难以编写和维护。

    多年来我使用的一种技术是通过使用命名捕获组来注释我的正则表达式。它并不完美,但可以极大地帮助您提高正则表达式的可读性和可维护性。

    这是一个满足您要求的正则表达式。

    ^(?<firstchar>(?=[A-Za-z]))((?<alphachars>[A-Za-z])|(?<specialchars>[A-Za-z]['-](?=[A-Za-z]))|(?<spaces> (?=[A-Za-z])))*$

    它分为以下几个部分:

    1) (?<firstchar>(?=[A-Za-z])) 这确保第一个字符是字母字符,大写或小写。

    2) (?<alphachars>[A-Za-z]) 我们允许更多的 alpha 字符。

    3) (?<specialchars>[A-Za-z]['-](?=[A-Za-z])) 我们允许特殊字符,但前后只能有字母字符。

    4) (?<spaces> (?=[A-Za-z])) 我们允许有空格,但只能有一个空格,后面必须跟字母字符。

    编写正则表达式时应该使用测试工具,我建议使用 https://regex101.com/

    您可以从下面的屏幕截图中看到此正则表达式的执行情况。

    使用我提供给您的正则表达式,在 https://regex101.com/ 中使用您想要匹配的样本运行它,然后调整它以满足您的要求。希望我已经为您提供了足够的信息,以便在根据您的需求定制它时自给自足。

    enter image description here

    您可以使用此链接运行正则表达式 https://regex101.com/r/O2wFfi/1/

    编辑

    我已经更新以解决您评论中的问题,而不仅仅是给您代码,我将解释问题以及我如何解决它。

    对于您的示例“Sam D'Joe”,如果我们运行原始正则表达式,则会发生以下情况。
    ^(?<firstchar>[A-Za-z])((?<alphachars>[A-Za-z])|(?<specialchars>[A-Za-z]['-][A-Za-z])|(?<spaces> [A-Za-z]))*$

    1) ^ 匹配字符串的开头
    enter image description here

    2) (?<firstchar>[A-Za-z]) 匹配第一个字符
    enter image description here

    3) (?<alphachars>[A-Za-z]) 匹配每个字符直到空格
    enter image description here

    4) (?<spaces> [A-Za-z]) 匹配空格和后续的 alpha 字符
    enter image description here

    匹配消耗它们匹配的字符

    这就是我们遇到问题的地方。正则表达式的“specialchars”部分匹配一个 alpha 字符,我们的特殊字符,然后是另一个 alpha 字符( (?<specialchars>[A-Za-z]['-](?=[A-Za-z])) )。

    关于正则表达式,您需要了解的一点是,每次匹配一个字符时,都会消耗该字符。我们已经在特殊字符之前匹配了 alpha 字符,所以我们的正则表达式永远不会匹配。

    每个步骤实际上看起来像这样:

    1) ^ 匹配字符串的开头
    enter image description here

    2) (?<firstchar>[A-Za-z]) 匹配第一个字符
    enter image description here

    3) (?<alphachars>[A-Za-z]) 匹配每个字符直到空格
    enter image description here

    4) (?<spaces> [A-Za-z]) 匹配空格和后续的 alpha 字符
    enter image description here

    然后我们剩下以下
    enter image description here

    我们无法匹配这个,因为我们的规则之一是“特殊字符 ' 和 – 之前和之后应该出现一个字母表”。

    展望

    正则表达式有一个叫做“lookahead”的概念。前瞻允许您在不消耗字符的情况下匹配字符!

    前瞻的语法是 ?= 后跟您想要匹配的内容。例如。 ?=[A-Z] 会提前查找大写字母的单个字符。

    我们可以通过使用前瞻来修复我们的正则表达式。

    1) ^ 匹配字符串的开头
    enter image description here

    2) (?<firstchar>[A-Za-z]) 匹配第一个字符
    enter image description here

    3) (?<alphachars>[A-Za-z]) 匹配每个字符直到空格
    enter image description here

    4)我们现在改变我们的“空格”正则表达式,以向前看 alpha 字符,所以我们不消耗它。我们将 (?<spaces> [A-Za-z]) 更改为 (?<spaces> ?=[A-Za-z]) 。这匹配空间并向前看后续的 alpha 字符,但不消耗它。
    enter image description here

    5) (?<specialchars>[A-Za-z]['-][A-Za-z]) 匹配 alpha 字符、特殊字符和后续的 alpha 字符。
    enter image description here

    6)我们使用通配符多次重复匹配我们之前的3条规则,我们匹配到行尾。
    enter image description here

    我还向“firstchar”、“specialchars”和“spaces”捕获组添加了前瞻,我将下面的更改加粗。

    ^(? (?= [A-Za-z] ) )((? [A-Za-z])|(? [A-Za-z][ '-] (?= [A-Za-z] ) )|(?<空格> (?= [A-Za-z] ) ))*$

    关于c# - 名字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51262557/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com