new Regex(@"^[a-zA-Z]+\b +\b[a-zA-Z]?\b +\b[a-zA-Z]+$")
匹配
John Smith
John B Goode
我正在尝试针对以下情况修改此正则表达式:
12359 (John B? Goode) 10249?
之前的一些文字
有时名称出现在字符串末尾的数字之后,并且可选地在最后的最后数字之前。
我试过了
new Regex(@"^|[0-9]+([a-zA-Z]+\b +\b[a-zA-Z]?\b +\b[a-zA-Z]+) *[0-9]*?$")
但这不起作用,因为
^|[0-9]+
仅匹配数字而不是行首sometext 12354
匹配的空字符串(第一个数字不需要在一行的末尾。更新
这是桥下的所有水,因为我在数据行的末尾找到了更多名称,所以这不起作用。
然而,解决我问题的方法并不是将OR扔进一个组。
答案 0 :(得分:2)
您需要围绕轮换进行括号:
(^|[0-9]+)
你的表达式与此相同:
new Regex(@"^|()")
它始终匹配字符串的开头而没有别的。
答案 1 :(得分:2)
编辑(艾伦摩尔的信息)
另一个尝试。问题陈述不清楚是否要进行 FULL 修正或只是尝试提取名称,只验证周围的提取。
如果尝试进行%100验证提取,那么应该关注BOL 否则,您只需要担心EOL。
对于%100验证:
(?:^|[0-9]+\ +)([a-zA-Z]+\ +(?:[a-zA-Z]\ +)?[a-zA-Z]+)(?:\ +[0-9]+)?$
扩展:
(?: ^ # BOL
| [0-9]+ \ + # or, leading numbers + space
)
( # Capt 1
[a-zA-Z]+ # first name
\ + # space
(?: [a-zA-Z] \ + )? # optional middle initial + space
[a-zA-Z]+ # last name
) # End Capt 1
(?: \ + [0-9]+ )? # optional space + trailing numbers
$ # EOL
或者,如果您只想提取文本,只需要EOL锚点,并且可以放松一些限制:
\b([a-zA-Z](?:\s+[a-zA-Z.]+)*)[\s\d]*$