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

編集(アラン・ムーアの情報について)

別の試み。問題の説明は、完全な評価を行うのか、名前を抽出しようとしているのか、周囲の抽出だけを検証するのかについては明確ではありません。

%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 に答える
2

交互に括弧が必要です。

(^|[0-9]+)

あなたの表現はこれと同等です:

new Regex(@"^|()")

常に文字列の先頭に一致し、それ以外には一致しません。

于 2012-06-08T20:48:12.907 に答える