正则表达式是出了名的难以编写和维护。
我多年来使用的一种技术是通过使用命名捕获组来注释我的正则表达式。它并不完美,但可以极大地帮助您提高正则表达式的可读性和可维护性。
这是一个满足您要求的正则表达式。
^(?<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)
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 字符,所以我们的正则表达式永远不会匹配。
每个步骤实际上看起来像这样:
2)(?<firstchar>[A-Za-z])匹配第一个字符

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

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

我们无法匹配它,因为我们的规则之一是“特殊字符 ' 和 – 之前和之后应该出现一个字母表”。
正则表达式有一个叫做“lookahead”的概念。前瞻允许您在不消耗字符的情况下匹配字符!
前瞻的语法?=后跟您要匹配的内容。例如,?=[A-Z]会寻找一个大写字母的单个字符。
我们可以通过使用前瞻来修复我们的正则表达式。
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] ) ))*$
| 归档时间: |
|
| 查看次数: |
5717 次 |
| 最近记录: |