【发布时间】:2017-10-06 14:38:56
【问题描述】:
为了学习正则表达式,我正在解决一些训练和学习的问题。这就是问题所在,我知道这可能不是使用 Regex 的最佳方式,而且我的 Regex 是一团糟,但我喜欢这个挑战。
问题:
- 名字必须是Title Case;
- 里面的一些小写单词有例外;
- 还有一些名字,例如:McDonald、MacDuff、D'Estoile
- 接受带有
'和-的名称,有时它们是 o'Brien、O'brien、O'Brien、O'Brien 或 'Ehu Kali。 - 名称的开头和结尾没有空格;
- 每个全名之间不超过一个空格;
-
.如果不是单独的,则被接受,例如:Dan。 Ferdnand(不接受)和 Dan G. Ferdnand(接受) - 不接受数字和符号
- 但是,罗马数字被接受,而不是标题大小写,例如:伊丽莎白二世
- 有些名字可以单独使用,例如:Akihito(日本王子)
- 接受某些国家/地区常见的一些特殊字符,例如:Valeh ßlÿsgÿroğlu、Lażżru Role、Alaksiej Taraškievič
正则表达式
代码是
^(?![ ])(?!.*(?:\d|[ ]{2}|[!$%^&*()_+|~=`\{\}\[\]:";<>?,\/]))(?:(?:e|da|do|das|dos|de|d'|la|las|el|los|l'|al|of|the|el-|al-|di|van|der|op|den|ter|te|ten|ben|ibn)\s*?|(?:[A-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð'][^\s]*\s*?)(?!.*[ ]$))+$
还有带有验证列表的Regex101
参考文献
到目前为止我所尝试的都是基于这些:
- regular expression for first and last name
- Regular Expression to disallow two consecutive white spaces in the middle of a string
- A regex to test if all words are title-case
- How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops
- Use Regex to Split Numbered List array into Numbered List Multiline
不工作
我做了这个正则表达式,但不知道如何让它无法识别以下匹配的情况:
- 大写字母
- 替代字母
那些不是而且应该:
- UrxanƏbűlhəsənzadə
- 伊斯米特·贾法罗夫
- Şükür Hagverdiyev
- Űmid Abdurrahimov
- Ġerardo Seralta
- Ċikku 巴黎
问题
有没有办法优化这个正则表达式(怪物)?
我该如何解决前面提到的无法正常工作的问题?
p.s.:带有验证示例的名称列表可以在 Regex101 的链接上找到。
【问题讨论】:
-
感谢您抽出时间来写一篇写得很好的帖子。您正在帮助我恢复对正确书写和格式问题的信心!
-
很难用 1 个正则表达式验证名称并涵盖所有语言。
No more than one space inside Name;所以我的名字不被接受? :'( ...无论如何,如果您正在练习尝试debuggex.com,它对我有很大帮助。 -
我会编辑/改写,每个名字之间不超过两个空格
-
请注意,语言和工具实现正则表达式的方式存在差异(通常表示为不同的正则表达式“风格”)。您是否决定使用一种风格(您的 regex101 链接会建议使用 JavaScript)?如果是这样,请告诉我们哪一个可能会导致不同的答案,尤其是关于非 ascii 字符处理的主题。