用于开头的正则表达式 - 或 - 句子中的最后一个数字

时间:2012-06-08 20:46:49

标签: c# regex string-search

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匹配的空字符串(第一个数字不需要在一行的末尾。
  3. 更新

    这是桥下的所有水,因为我在数据行的末尾找到了更多名称,所以这不起作用。

    然而,解决我问题的方法并不是将OR扔进一个组。

2 个答案:

答案 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]*$