1
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]*?$")

但这不起作用,因为

  1. 唯一^|[0-9]+匹配数字不再是行首
  2. 该组始终是一个空字符串,匹配类似的内容sometext 12354(第一个数字不需要位于行尾。

更新

这都是桥下的水,因为我在数据行的末尾发现了更多的名字,所以这不起作用。

但是,我的问题的解决方案不是将 OR 放在一个组中。

4

2 回答 2

2

您需要在交替周围加上括号:

(^|[0-9]+)

你的表达相当于这样:

new Regex(@"^|()")

它始终与字符串的开头匹配,仅此而已。

于 2012-06-08T20:48:12.907 回答
2

编辑(重新艾伦摩尔的信息)

再试一次。问题陈述不清楚您是要进行完整验证还是只是尝试提取名称,仅验证周围的提取。

如果尝试 %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]*$
于 2012-06-08T21:52:50.710 回答