これは、使用している RegEx の「フレーバー」によってある程度異なります。\b
以下は、単語境界に使用する .NET RegEx に基づいています。最後の例では、否定的なルックアラウンド(?<!)
と(?!)
非キャプチャ括弧も使用しています(?:)
ただし、基本的には、用語に常に少なくとも 1 つの大文字とそれに続く少なくとも 1 つの数字が含まれている場合は、次のように使用できます。
\b[A-Z]+[0-9]+\b
すべて大文字と数字の場合 (合計は 2 以上である必要があります):
\b[A-Z0-9]{2,}\b
すべて大文字と数字で、少なくとも 1 つの文字で始まる場合:
\b[A-Z][A-Z0-9]+\b
おじいちゃん、大文字と数字の任意の組み合わせを含むが、行頭の単一文字ではなく、すべて大文字の行の一部ではないアイテムを返します。
(?:(?<!^)[A-Z]\b|(?<!^[A-Z0-9 ]*)\b[A-Z0-9]+\b(?![A-Z0-9 ]$))
壊す:
正規表現は で始まり(?:
ます。は次の?:
ことを意味します -- 以下は括弧内にありますが、結果をキャプチャすることに興味はありません。これは「非キャプチャ括弧」と呼ばれます。ここでは、代替を使用しているため、括弧を使用しています (以下を参照)。
非キャプチャ括弧内には、パイプ記号 で区切られた 2 つの別個の節があります|
。これは交替です。「または」のようなものです。正規表現は、最初の式または2 番目の式と一致できます。ここでの 2 つのケースは、「これは行の最初の単語ですか」または「その他すべて」です。これは、行の先頭にある 1 文字の単語を除外するという特別な要件があるためです。
それでは、交代の各表現を見てみましょう。
最初の式は次のとおり(?<!^)[A-Z]\b
です。ここでの主要な句は[A-Z]\b
で、これは任意の 1 つの大文字の後に句読点、空白、改行などの単語境界が続くものです。その前の部分(?<!^)
は、「否定後読み」です。これはゼロ幅のアサーションです。つまり、一致の一部として文字を「消費」しません。ここでそれを理解することはあまり重要ではありません。.NET での否定後読みの構文は次のとおりです。x(?<!x)
は、主節の前に存在してはならない式です。ここで、その表現は単純に 、または行頭であるため、交代のこちら側は「行頭にない単一の大文字からなる任意の単語」と解釈されます。^
さて、行の先頭にない 1 文字の大文字の単語を照合しています。すべての数字と大文字で構成される単語を一致させる必要があります。
これは、alternation: の 2 番目の式の比較的小さな部分によって処理されます\b[A-Z0-9]+\b
。\b
s は単語の境界を表し、 は 1 つ以上の数字と大文字を一緒に一致[A-Z0-9]+
させます。
式の残りの部分は、他のルックアラウンドで構成されています。(?<!^[A-Z0-9 ]*)
は別の否定的な後読みで、式は^[A-Z0-9 ]*
です。これは、先行するものはすべて大文字と数字であってはならないことを意味します。
2 番目の(?![A-Z0-9 ]$)
ルックアラウンドは、否定先読みです。これは、後に続くすべてが大文字と数字であってはならないことを意味します。
したがって、全体として、すべて大文字と数字の単語をキャプチャし、行頭から 1 文字の大文字を除外し、すべて大文字の行からすべてを除外します。
ここには、2 番目の代替表現のルックアラウンドが独立して機能するという点で、少なくとも 1 つの弱点があります。したがって、「A P1 should connect to the J9」のような文は J9 と一致しますが、P1 とは一致しません。
この問題を回避することは可能ですが、正規表現の長さがほぼ 3 倍になります。単一の正規表現で多くのことを行おうとすることは、正当化されることはほとんどありません。作業を複数の正規表現に分割するか、選択したプログラミング言語で正規表現と標準の文字列処理コマンドを組み合わせた方がよいでしょう。