打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
c# – 名字的正则表达式

我是正则表达式的新手,需要正则表达式满足以下条件的名字:

>名字必须仅包含字母.它可能包含空格,连字符或撇号.
>必须以字母开头.
>所有其他字符和数字无效.
>特殊字符’和 – 不能在一起(例如不允许使用John’-s)
>在特殊字符’和 – 之前和之后应该有一个字母表 – (例如,不允许使用John)
>不允许连续两个空格(例如不允许使用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/中运行你想要匹配的样本,然后调整它以满足你的要求.希望我已经为您提供了足够的信息,可以根据您的需求进行自定义.

您可以使用此链接运行正则表达式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)^匹配字符串的开头

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

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

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

匹配消耗它们匹配的字符

这是我们遇到问题的地方.正则表达式中我们的“specialchars”部分匹配alpha char,我们的特殊char,然后是另一个alpha char((?< 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 char

然后我们留下以下内容

我们无法与之匹敌,因为我们的一条规则是“字母应该出现在特殊字符之前和之后”和 – “.

展望

正则表达式有一个名为“lookahead”的概念.前瞻允许您匹配角色而不消耗它!

前瞻的语法是?=后跟你想要匹配的内容.例如. ?= [A-Z]会向前看一个大写字母的单个字符.

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

1)^匹配字符串的开头

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

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

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

5)(?< specialchars> [A-Za-z] [‘ – ] [A-Za-z])匹配alpha char,特殊字符和后续alpha字符.

6)我们使用通配符多次重复匹配我们之前的3个规则,并匹配直到行结束.

我还在“firstchar”,“specialchars”和“space”捕获组中添加了前瞻,我已经对下面的更改加粗了.

^((小于alphachars&GT [A-ZA-Z])|(小于(小于; firstchar&GT(= [A-ZA-Z])?)?specialChars中&GT [A-ZA-Z] [” – ](?= [A-Za-z]))|(?< space>(?= [A-Za-z])))* $

来源:https://www.icode9.com/content-1-272751.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
正则表达式----合法E-mail地址
特殊字符前面加斜线的代码
常用正则表达式
Python正则表达式初识(八)
正则表达式基础
常用密码正则式(密码正则表达式大全)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服