0

ファイルを解析して XML に変換するアプリケーションがあります。アプリケーション内の処理モジュールの 1 つは、正規表現を使用してフリー テキスト内のパターンを検索します。2 つのパターンを識別しようとしていますが、あまり成功していません。

パターン 1: 2 つの文字 (母音を除く)、2 つの数字 (1-9)、2 つの文字 (母音を除く)、さらに定義された 2 つの文字 (例: WP、NL、GP、EC など)。各グループ間にスペースがあってもなくても構いません。

例:

BQ 12 RT WP
BQ12RTGP
BQ12RT GP

パターン 2: 3 つの文字 (az) の後に 3 つの数字 (1-9) が続き、さらに 2 つの定義された文字が続きます (例: WP、NL、GP、EC など)。各グループ間にスペースがあってもなくても構いません。

例:

ABC 123 GP
ABC123GP
ABC123 GP

これは、テキスト内の特定の単語を見つける正規表現の例です。

4

4 に答える 4

4

正規表現の経験があまりないので、ここでたくさん説明します。

最初に少し背景を説明します。正規表現にはトークンと数量詞があります。トークンは、何かに一致するものです。たとえばA、ラテン大文字のAに一致するトークンです。数量詞は、トークンの後に配置され、そのトークンが連続して一致する頻度を変更することによってトークンに適用されます。たとえば+、前のトークンがで一致するように数量化子です。少なくとも1回は、、、、またはにA+一致Aします。AAAAAAAAAAAAA

それが邪魔にならないように、必要になるさまざまな種類のトークンについての簡単な入門書です。

  1. すでに述べたもの:、などのリテラル文字A1またはその他。これは、いくつかの定義された値の1つを取ることができるパーツに必要になります。WP一致WPしますが、他には何もありません。

  2. キャラクタークラスがあります。それらは角括弧で書かれ、それぞれが一致する可能性のあるさまざまな文字を含みます。文字クラスはまたはのいずれ[AB]に一致します。文字範囲も存在する可能性があるため、ASCIIの一部であるすべての大文字のラテン文字に一致し、からまでの任意の数字に一致します。 A B[A-Z][1-9]19

次に、必要になるいくつかの数量詞:

  1. ?先行するトークンがまったく一致しないか、1回だけ一致するため、 (適用されるのは–直前のトークンにのみ適用されることをAB?忘れないでください)またはのいずれかに一致します。可能であれば、常に一致しようとします。?BAABAB

  2. 正確な繰り返し{5}は、中かっこで囲まれた数字で書くことができます。A{2}一致しAAます。

これで、正規表現の作成を開始できます。

まず、母音のない文字を含む文字クラスが必要です。[A-Z]明らかにそれらが含まれるので、それは十分ではありません。ただし、複数の範囲を使用できます。

[B-DF-HJ-NP-TV-Z]

きれいではありませんが、機能します。一部の正規表現エンジンには、実際のセット操作のプロビジョニングがあります。たとえば、文字クラスを使用して特定の文字を再度除外するためのセットの違いですが、今のところこれで十分です。

ただし、2つの文字があるため、そのうちの2つが必要です。

[B-DF-HJ-NP-TV-Z]{2}

それからスペースがあるかどうか。すべての空白(スペースとタブを含む)を含む省略文字クラスがあります\s。スペースのみを表示できるという厳密な要件がない限り、これを使用できます\s?。堅牢性を高めるため\s*に、スペースがない場合でもスペースがない場合でも、任意の数のスペースに一致するものを使用することもできます。

1次に、から9:までの数字が必要です。[1-9]実際には、そのうちの2つが再び:[1-9]{2}です。これまでのところ、次のものがあります。

[B-DF-HJ-NP-TV-Z]{2}\s*[1-9]{2}

次に、母音のない2つの文字が必要です。ここでも、スペースがあるかどうかは関係ありません。

[B-DF-HJ-NP-TV-Z]{2}\s*[1-9]{2}\s*[B-DF-HJ-NP-TV-Z]{2}\s*

その後、いくつかの定義されたオプションの1つが可能な部分があります。それらは、縦棒を使用する交互に書くことができます|。最初に、数学のように括弧で書かれたグループが必要です。これは、交互の優先順位を制限するためです(これも数学の場合と同じです)。それらの中には、すべての可能なオプションを次のように区切ってリストしています|

(WP|NL|GP|EC|etc.)

これは文字クラスと同じですが、複数の文字に一致する点が異なります(ただし、提示されたものから1つのオプションのみが一致します)。

すべてをまとめると、

[B-DF-HJ-NP-TV-Z]{2}\s*[1-9]{2}\s*[B-DF-HJ-NP-TV-Z]{2}\s*(WP|NL|GP|EC|etc.)

次に、1つ小さなことがあります。ほとんどのエンジンの正規表現はデフォルトでサブストリングと一致するため、これは周囲に文字がある場合でも一致します。上記で一致するものは、いわば単一の「単語」である必要があるとはどこにも言いませんでしたkhdgdfgergBQ12RTGPrteryefg。どこかで見つけた可能性があります。それ自体はどの文字とも一致しないが、一致を特定の場所に結び付ける特定のアサーションがあることを防ぐため。便利なものの1つは、からの文字(実際にはまったく役に立たず、文字、数字、アンダースコアを含む省略形の文字クラス)とからではない文字\bの間に境界がある場所に一致するものです。すばやく汚いハックを行うには、単語の最初または最後に一致するようにするのに十分です。\w\w\b\bfoo\b一致しますが、一致fooa foo bませんfoobar。より堅牢であるが、書き込みに時間がかかるオプションがあります。したがって、いくつかの目的には十分な次のものを使用できます。

\b[B-DF-HJ-NP-TV-Z]{2}\s*[1-9]{2}\s*[B-DF-HJ-NP-TV-Z]{2}\s*(WP|NL|GP|EC|etc.)\b

ただし、2番目のパターンの作成は今からあなたに任せます。これで、自分でそれを行うのに十分な知識が必要になります。

ちなみに、正規表現を学ぶのに本当に良いサイトはregular-expressions.infoです。物事は私がこれまでにできたよりもずっとよく説明されており、それは学習や参考としても同様に役立ちます。

于 2013-03-07T09:28:59.563 に答える
0

あなたはこのようなことを試すことができます:

パターン1:

[^\W\d_.AEIOUYaeiouy]{2}\s*\d{2}\s*[^\W\d_.AEIOUYaeiouy]{2}\s*(?:WP|NL|GP|EC)

[bcdfghjklmnpqrstvwxzBCDFGHJKLMPQRSTVWXZ]大文字と小文字を区別しないようにするか、常に大文字になることがわかっている場合は、より短いため、反転グループを使用すると非常に簡単です。短くすることができます。2文字の「単語」を追加|XXするには、最後の部分(括弧内)に追加します。

パターン2:

[A-Za-z]{3}\s*\d{3}\s*(?:WP|NL|GP|EC)

使用している言語によっては、いくつかの変更が必要になる場合があります。

于 2013-03-07T09:08:08.360 に答える
0

文字が大文字である必要があると仮定すると、次のようになります。

パターン 1:[BCDFGHJ-NP-TV-Z]{2}\s*[1-9]{2}\s*[BCDFGHJ-NP-TV-Z]{2}\s*(?:WP|NL|GP|EC)

パターン 2:[A-Z]{3}\s*[1-9]{3}\s*(?:WP|NL|GP|EC)

\b文字列を単語以外の文字または文字列の開始/終了で区切る必要がある場合は、それぞれの開始と終了に追加することを検討することもできます。

于 2013-03-07T09:10:00.687 に答える
0

この正規表現でそれを行うことができます

^(?!.*[aeiou].*(WP|NL|GP|EC))[a-zA-Z]{2}\s*\d{2}\s*[a-zA-Z]{2}\s*(WP|NL|GP|EC)$
于 2013-03-07T09:17:58.370 に答える