名字的正则表达式

Sum*_*ngh 4 c# regex

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

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

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

Rei*_*ica 5

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

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

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

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

它分为以下几个部分:

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/ 中运行它,并带有你想要匹配的样本,然后调整它以满足你的要求。希望我已经为您提供了足够的信息,以便在根据您的需求定制它时自给自足。

在此处输入图片说明

您可以使用此链接运行正则表达式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]))*$
Run Code Online (Sandbox Code Playgroud)

1)^匹配字符串的开头 在此处输入图片说明

2)(?<firstchar>[A-Za-z])匹配第一个字符 在此处输入图片说明

3)(?<alphachars>[A-Za-z])匹配每个字符直到空格 在此处输入图片说明

4)(?<spaces> [A-Za-z])匹配空格和后续的 alpha 字符 在此处输入图片说明

匹配消耗它们匹配的字符

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

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

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

1)^匹配字符串的开头 在此处输入图片说明

2)(?<firstchar>[A-Za-z])匹配第一个字符 在此处输入图片说明

3)(?<alphachars>[A-Za-z])匹配每个字符直到空格 在此处输入图片说明

4)(?<spaces> [A-Za-z])匹配空格和后续的 alpha 字符 在此处输入图片说明

然后我们剩下以下 在此处输入图片说明

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

展望

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

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

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

1)^匹配字符串的开头 在此处输入图片说明

2)(?<firstchar>[A-Za-z])匹配第一个字符 在此处输入图片说明

3)(?<alphachars>[A-Za-z])匹配每个字符直到空格 在此处输入图片说明

4)我们现在改变我们的“空格”正则表达式,以向前看 alpha 字符,所以我们不消耗它。我们(?<spaces> [A-Za-z])改为(?<spaces> ?=[A-Za-z])。这匹配空间并向前看后续的 alpha 字符,但不消耗它。 在此处输入图片说明

5)(?<specialchars>[A-Za-z]['-][A-Za-z])匹配 alpha 字符、特殊字符和后续的 alpha 字符。 在此处输入图片说明

6)我们使用通配符多次重复匹配我们之前的3条规则,我们匹配到行尾。 在此处输入图片说明

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

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


小智 5

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

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

  • ([-\s'][a-zA-Z]+)*?- 表示字符串必须包含连字符、空格或撇号,后跟字母。在此输入图像描述

  • ^and $ - 表示字符串的开头和结尾

这是正则表达式演示的链接