我想写一个RegEx的名字。姓名可以选择以头衔(Dr., Mrs.等)开头,也可以包含两个或三个名字,中间名可以选择缩写为(x)
例如,以下名称应该匹配:
- 。Jeff T. Walker
- Susan B. Anthony
- 。迈克尔·宾厄姆顿
- 。乔治•布什
- 加菲尔德
- 。J
- T。疼痛
- 美国
- 2020年2月15日
我有:
^(Dr.|Mr.|Mrs.)?[A-Z][a-z]+s([A-Z][a-z]+|[A-Z].)s[A-Z][a-z]+?
我不太确定我哪里出错了
^((Dr|Mr|Mrs). )?[A-Z][a-z]+( [A-Z]([a-z]+|.))? [A-Z][a-z]+
我是这样做的:
- 在前缀后添加空格-之前,您匹配的是"Dr.James",而不是"Dr.James"
- 删除姓氏后面的问号-当不在括号后面时,
?
会导致"延迟匹配"-匹配尽可能少的字符(在本例中为1) - 使中间名可选
- 删除了一些冗余(例如前缀和中间名)
- 用空格代替
s
-更容易阅读,并且s匹配制表符,换行符等。