ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 名字的正则表达式

2019-06-27 10:55:44  阅读:178  来源: 互联网

标签:c regex


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

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

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

匹配消耗它们匹配的字符

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

然后我们留下以下内容
enter image description here

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

展望

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

前瞻的语法是?=后跟你想要匹配的内容.例如. ?= [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字符,所以我们不消耗它.我们将(?< space> [A-Za-z])改变为(?< space>?= [A-Za-z]).这匹配空间并向前看到后续的alpha char,但不消耗它.
enter image description here

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

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

我还在“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])))* $

标签:c,regex
来源: https://codeday.me/bug/20190627/1303988.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有