2

基本的にアドレスを抽出するために正規表現を使用しています。私がやりたいことは、私のコードブロックのような正規表現を使用して住所を抽出できるようにすることですが、場合によっては、返された一致 (例: STREET A、CNR) に開始点/基準テキストを含めます。その他のケースでは、2 つのポイント間のすべてのテキストが取得されますが、返される一致にポイントの 1 つが含まれません。

文字列内の2つの定義されたポイント間のすべてを返す正規表現文字列を作成するのを誰かが手伝ってくれることを願っています。問題は、一致に正規表現 (例: CNR) のフレーズを含める必要がある場合と、別のフレーズを一致に含める必要がない場合 (例: テキストの例) です。

これは Regex の例です。この場合、STREET A が存在する場合、一致にそれが含まれます: Regex = New Regex("( CNR| STREET A| EXAMPLE TEXT)(.*?)(?=\SVSE| M | SVC | SVSW | SVNE |SVNW )"、RegexOptions.RightToLeft)

上記の正規表現で STREET A (または別のフレーズ) をマーカーとして使用して、正規表現の一致を返しますが、実際には一致自体に含めないようにするにはどうすればよいですか?

ありがとう!

以下に追加情報を含めましたので、お役に立てれば幸いです。これらはいくつかの例です:

一致の基準となるものはすべてイタリック体にしました。次に、太字にしたアイテムが一致する必要があります。これらはほんの数例ですが、実際にはアドレスが常に123例であるとは限らないため、正規表現は非常に多くの異なるものに一致する可能性がありますセント。

@@ALERT SMPL1 F0000000ガス管漏れ MAIN HWY SUBURB SVNW 1111 A1 (375302) SMPLT1 [SMPL]

@@ALERT F0000000 SMPL1 STRUC1 煙警報作動と煙の臭いCNRサンプルST/例 ST郊外 SVNE 1111 D7

@@ALERT SMPL1 F0000000自動車事故- POSS PERSON TRAPPED MAIN HWY SUBURB SVNW 1111 A1 (375302) SMPLT1 [SMPL]

@@ALERT F0000000 SMPL1 STRUC1ガスボトル爆発 サンプル ST/サンプル ST 郊外 SVNE 1111 D7

- - 詳しくは - -

これは現在の正規表現です(そして機能します)が、最初に複数の一致を除外するのに苦労しています:

(CNR|(([\d]+/[\d]+)|([\d]+ / [\d]+)|([\d]+-[\d]+)|([\d]+ - [\d]+)|( [\d]+ ))).*?(?=SV[NCSEW]| M )|(?<=GAS PIPE LEAK).*?(?=SV[NCSEW]| M )

これは私が試して達成したいことです:(しかし、うまくいきません)

(CNR|(([\d]+/[\d]+)|([\d]+ / [\d]+)|([\d]+-[\d]+)|([\d]+ - [\d]+)|( [\d]+ ))).*?(?=SV[NCSEW]| M )|(?<=(GAS PIPE LEAK|FIRE ALARM|SMOKE ALARMS|FIRE|)).*?(?=SV[NCSEW]| M )

文字列の例を次に示します。

@@ALERT F000000 BELM4 STRUC1 作動煙警報 JACARANDA ST 郊外 /ROAD ST M 000 K3 (000000)

@@ALERT F000000 BELM4 STRUC1 FIRE JACARANDA ST SUBURB /ROAD ST M 000 K3 (000000)

@@ALERT F000000 BELM4 STRUC1 爆発 123 JACARANDA ST SUBURB /ROAD ST M 000 K3 (000000)

@@ALERT F000000 BELM4 不明な火災 JACARANDA ST SUBURB /ROAD ST M 000 K3 (000000)

4

2 に答える 2

0

あなたは多分そのようなものを使うことができます:

((?<=(?:GAS PIPE LEAK|CAR ACCIDENT - POSS PERSON TRAPPED|GAS BOTTLE EXPLOSION) )|CNR).*?(?= [A-Z]+ [0-9]+)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^^
                                          1                                        2

最初の部分が一致しない部分で、2 番目の部分が一致する部分です。

アドレスの前にさまざまなバリエーションのフレーズがある場合、正規表現はあまり実用的ではないことに注意してください。ただし、いくつかのパターンを特定できる場合、それはより適切なツールである正規表現になります:)


編集:更新に続いて、次のようなことを試すことができます:

((?<=(?:GAS PIPE LEAK|FIRE|RHS|ROOF|TRAPPED|EXPLOSION|ALARMS) )|CNR).*?(?= SV[NCSEW]| M\b)

regexhero.netでテストしましたが、アカウントを購入しないとパーマリンクを作成できないため、8 つのサンプル入力を使用した結果を以下に示します。

MAIN HWY SUBURB
CNR SAMPLE ST/EXAMPLE ST SUBURB
MAIN HWY SUBURB
SAMPLE ST/EXAMPLE ST SUBURB
JACARANDA ST SUBURB /ROAD ST
JACARANDA ST SUBURB /ROAD ST
123 JACARANDA ST SUBURB /ROAD ST
JACARANDA ST SUBURB /ROAD ST

それ以外の場合、現在の正規表現は、ネストされたすべてのキャプチャ グループで読み取り可能ではありません。一部を非キャプチャ グループに変更し、一部のオプションを最初の番号で再グループ化することを検討してください。

(?:CNR|\b\d+(?:\s?[/-]\s?\d+)?\b).*?(?= SV[NCSEW]| M\b)|(?<=(?:GAS PIPE LEAK|FIRE ALARM|SMOKE ALARMS|FIRE|TRAPPED|EXPLOSION) ).*?(?= SV[NCSEW]| M\b)

先読みにいくつかのオプションを追加し、先読み|の最後にある唯一のパイプを削除しました。

[私も\b一般的にスペースの代わりに使用します。\b単語の境界に一致します。つまり、「単語」の先頭または末尾でのみ一致します (単語は英数字でアンダースコアを含みます)]

于 2013-10-28T12:26:54.310 に答える
0

接頭辞と接尾辞の一致式を使用してから、または結果を他の一致で使用できます

(?<=GAS PIPE LEAK).*?(?=SVN[EW])|(CNR|STREET A).*?(?=SVN[EW])
于 2013-10-28T11:30:33.473 に答える