4

この問題に最適な正規表現を作成する手助けが必要です。

開始区切りと終了区切りの組み合わせ/セットがあり、すべての部分文字列/開始区切りから終了区切りまでの単語を取得する必要があります。

次の区切り記号の表を想定します。

スタート | 終わり

猫 | 猫 | 犬

りんご | オレンジ

ライオン | シマウマ

パンダ | 猫

サンプル入力:

substring1 CAT substring2 substring3 DOG substring4 substring5 CAT substring6
APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG substring10 PANDA
substring11 CAT substring12 DOG substring13 LION substring10 substring11 ZEBRA substring12
CAT substring13 substring14 APPLE substring15 substring 16 ORANGE

出力は次のようにする必要があります。

  1. CAT サブストリング 2 サブストリング 3 DOG
  2. APPLE substring7 substring8 ORANGE
  3. PANDA 部分文字列 11 CAT
  4. LION substring10 substring 11 ZEBRA
  5. APPLE substring15 substring16 ORANGE

私の正規表現:

 CAT (.)*? DOG | APPLE (.)*? ORANGE | LION (.)*? ZEBRE |  PANDA (.)*? CAT 

他の開始区切り文字が複数出現する文字列の処理に問題があります。

たとえば、次のようにします。

CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

このCAT (.)*?と一致することはわかってい ます。DOGですが、部分文字列に開始区切り文字の 1 つが含まれているため、これは間違っています。

部分文字列に他の開始区切り文字が含まれていない場合、開始区切り文字から一致する終了区切り文字までのすべての単語を取得する正規表現が必要です。

なにか提案を?ありがとう

4

2 に答える 2

2

ここで役立つテクニックは、「ルックアラウンド」と呼ばれます。

nfiniumの明確化とjsoboからのフィードバックの後、回答を更新しました

CAT ((?!(APPLE|LION|PANA)).)*? DOG|APPLE ((?!(CAT|LION|PANDA)).)*? ORANGE|LION ((?!(CAT|APPLE|PANDA)).)*? ZEBRA|PANDA ((?!(APPLE|LION)).)*? CAT

入力が与えられた場合:

substring1 CAT substring2 substring3 DOG substring4 substring5 CAT substring6 APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG substring10 PANDA substring11 CAT substring12 DOG substring13 LION substring10 substring11 ZEBRA substring12 CAT substring13 substring14 APPLE substring15 substring 16 ORANGE  string CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG etc. CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG wordx

一致します

CAT substring2 substring3 DOG
APPLE substring7 substring 8 ORANGE
PANDA substring11 CAT
LION substring10 substring11 ZEBRA
APPLE substring15 substring 16 ORANGE
CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG

具体的には、nfinium で示されているように、次のものには一致しません。

CAT word1 word2 word3 word4 APPLE word5 word6 word7 DOG 

また、あなたが指摘したように一致します

CAT dkdkdkdkdk CAT dkdkdk dkdkdk ORANGE dkdkdkdk DOG 

次のように一致する必要があると言います

CAT substring12 DOG

しかし、上のCATはの終了区切り文字であるため、そうすべきではないと思います

PANDA substring11 CAT

この正規表現は、nfinium の期待される結果を生成します

nfinium CAT の要件により、開始区切り文字と終了区切り文字を使用できることに注意してください。

CAT | DOG
PANDA | CAT
于 2012-05-18T11:46:36.873 に答える
0

これの鍵は、次の2番目と出力だと思います。

 "APPLE substrin7 substring8 ORANGE" 

これは次の場所に含まれています。

 "CAT substring6 APPLE substring7 substring 8 ORANGE ORANGE substring9 DOG"

基本的に、APPLE | が続かない Cat をキャッチする必要があります。オレンジ | ライオン | ゼブラ | パンダ | それらが別のグループを開始するので、CAT。これは潜在的に可能ですが、これを行う正規表現を作成することは、正規表現で HTML を解析しようとすることに似ています。

参照: XHTML 自己完結型タグを除く RegEx マッチ オープン タグ

それは可能ですが、正規表現は非常に複雑になるため、この問題はコードで処理するのが最適です...

これは、最初の 2 つの開始終了コンボを処理する必要があると思われる例です。

(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG)|(APPLE(?!.+(?:APPLE|LION|ZEBRA|PANDA|CAT|DOG).+ORANGE).*?ORANGE)

ただ最初のグループは...

(CAT(?!.+(?:APPLE|ORANGE|LION|ZEBRA|PANDA|CAT).+DOG).*?DOG)

これにより、より多くの組み合わせがあるかどうかがわかります。非常に冗長になります。

于 2012-05-18T11:45:29.813 に答える