正则表达式的名字

时间:2018-07-10 10:10:35

标签: c# regex

我对regex东西很陌生,需要满足以下条件的名字才需要regex:

  1. 名字必须只包含字母。它可以包含空格,连字符或撇号。
  2. 必须以字母开头。
  3. 所有其他字符和数字均无效。
  4. 特殊字符不能在一起(例如,不允许使用John's)
  5. 在特殊字符之前和之后都应存在一个字母(例如,不允许John's)
  6. 不允许连续两个空格(例如,不允许Annia St)

有人可以帮忙吗?我尝试了此^([a-z]+['-]?[ ]?|[a-z]+['-]?)*?[a-z]$,但无法正常工作。

3 个答案:

答案 0 :(得分:2)

众所周知,正则表达式很难编写和维护。

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

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

^(?<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])我们允许更多的字母字符。

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])匹配空格和随后的字母字符 enter image description here

匹配消耗匹配的字符

这是我们遇到问题的地方。正则表达式的“特殊字符”部分匹配一个字母字符,一个特殊字符,然后匹配另一个字母字符((?<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])匹配空格和随后的字母字符 enter image description here

然后剩下以下内容 enter image description here

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

先行

正则表达式的概念称为“超前”。前瞻性功能可让您匹配字符而不消耗它!

前瞻的语法为?=,后跟要匹配的内容。例如。 ?=[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])。这与空间匹配,并期待下一个字母字符,但不消耗它。 enter image description here

5)(?<specialchars>[A-Za-z]['-][A-Za-z])匹配字母字符,特殊字符和后续字母字符。 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] ))* $

答案 1 :(得分:1)

这个简短的正则表达式应该^([a-zA-Z]+?)([-\s'][a-zA-Z]+)*?$

  • ([a-zA-Z]+?)-表示字符串应以字母开头。

  • ([-\s'][a-zA-Z]+)*?-表示字符串必须带有连字符,空格或撇号,后跟字母。enter image description here

  • ^$-表示字符串的开始和结束

这是指向正则表达式演示https://regex101.com/r/jrBhVS/6的链接

答案 2 :(得分:0)

试试这个

^[^- '](?=(?![A-Z]?[A-Z]))(?=(?![a-z]+[A-Z]))(?=(?!.*[A-Z][A-Z]))(?=(?!.*[- '][- '.]))(?=(?!.*[.][-'.]))[A-Za-z- '.]{2,}$

Image Demo