我对regex东西很陌生,需要满足以下条件的名字才需要regex:
‘
和–
不能在一起(例如,不允许使用John's)‘
和–
之前和之后都应存在一个字母(例如,不允许John's)有人可以帮忙吗?我尝试了此^([a-z]+['-]?[ ]?|[a-z]+['-]?)*?[a-z]$
,但无法正常工作。
答案 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/中运行您想要匹配的样本,并对其进行调整以符合您的要求。希望我给了您足够的信息,可以根据您的需求进行自我调整。
您可以使用此链接运行正则表达式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]))*$
2)(?<firstchar>[A-Za-z])
匹配第一个字符
3)(?<alphachars>[A-Za-z])
匹配每个字符直至空格
4)(?<spaces> [A-Za-z])
匹配空格和随后的字母字符
这是我们遇到问题的地方。正则表达式的“特殊字符”部分匹配一个字母字符,一个特殊字符,然后匹配另一个字母字符((?<specialchars>[A-Za-z]['-](?=[A-Za-z]))
)。
您需要了解的正则表达式是,每次匹配一个字符时,该字符就会被消耗。我们已经在特殊字符之前匹配了alpha字符,因此我们的正则表达式将永远不会匹配。
每个步骤实际上是这样的:
2)(?<firstchar>[A-Za-z])
匹配第一个字符
3)(?<alphachars>[A-Za-z])
匹配每个字符直至空格
4)(?<spaces> [A-Za-z])
匹配空格和随后的字母字符
我们无法匹配此规则,因为我们的规则之一是“在特殊字符‘和–之前和之后应该出现一个字母”。
正则表达式的概念称为“超前”。前瞻性功能可让您匹配字符而不消耗它!
前瞻的语法为?=
,后跟要匹配的内容。例如。 ?=[A-Z]
会期待一个大写字母的字符。
我们可以通过提前使用来修复正则表达式。
2)(?<firstchar>[A-Za-z])
匹配第一个字符
3)(?<alphachars>[A-Za-z])
匹配每个字符直至空格
4)现在,我们更改“空格”正则表达式,以提前使用alpha字符,因此我们不使用它。我们将(?<spaces> [A-Za-z])
更改为(?<spaces> ?=[A-Za-z])
。这与空间匹配,并期待下一个字母字符,但不消耗它。
5)(?<specialchars>[A-Za-z]['-][A-Za-z])
匹配字母字符,特殊字符和后续字母字符。
6)我们使用通配符重复匹配前面的3条规则,直到匹配到行尾为止。
我还为“ firstchar”,“ specialchars”和“ spaces”捕获组添加了超前功能,在下面的更改中加了粗体。
^(?
答案 1 :(得分:1)
这个简短的正则表达式应该^([a-zA-Z]+?)([-\s'][a-zA-Z]+)*?$
,
这是指向正则表达式演示https://regex101.com/r/jrBhVS/6的链接
答案 2 :(得分:0)
试试这个
^[^- '](?=(?![A-Z]?[A-Z]))(?=(?![a-z]+[A-Z]))(?=(?!.*[A-Z][A-Z]))(?=(?!.*[- '][- '.]))(?=(?!.*[.][-'.]))[A-Za-z- '.]{2,}$