1

いつものように、私は世界で最悪の正規表現作成者です。でも今回は本当に頑張った。

したがって、私の目標は、検索関連のものを処理する 1 つの正規表現を作成することです。検索クエリは次のようになります。

  • スタックオーバーフロー
  • "スタックオーバーフロー"
  • タイトル="スタック オーバーフロー"
  • type:image title=スタック オーバーフロー
  • スタックオーバーフロー タイプ:画像
  • ステータス:閉じたタイプ:画像のタイトル:スタック オーバーフロー

しかし、それはそれらを別々に検出できるはずです..そして、直接一致する引用を検出できるはずです..タイトルのみ、その背後に検索クエリが必要ですが、他の条件はどのような順序でもかまいません.

そして今、私はとても立ち往生しています..私はこの正規表現を行うことができました。status:closed type:image title:stack overflowでのみ機能します。物事の間のドット()はそれを機能させます。| に置き換えると、一致する最初の部分が得られます。しかし、考えられるすべてのクエリ形式でこれを機能させることは、私には不可能です。

/(?:(?:status[:](closed|open)).(?:type[:](image|video)).(?:(?:title|author|actor|movie)[:](.+)))/i

ここにツールがあります。私はこれをすべてやろうとしました: http://regexr.com/39an1私の落書きもそこにあります。

これは、検索エンジン タイプのものです。ですから、この試合の結果が PHP 内で使いやすいものになることを願っています。また、誰かがこれから非常に恩恵を受ける可能性があると思います。解決策があるでしょう。

誰かが私をすぐに指摘できれば、少なくともドット対|。主なものの間()。|のように感じます。= または、しかし、私はちょっと and-or のようなものが欲しいです。

4

1 に答える 1

8

正規表現を参照してください:

/^(?=.*status[:=](\S+)|)(?=.*type[:=](\S+)|)(?:.*?title[:=])?(?|"([^"]+)"|((?:(?!\s?(?:type|status)).)+))[^"]*$/

キャプチャ グループを使用して情報を抽出できます。

ここに正規表現のデモがあります!

式の説明:

  • ^文字列の開始位置をアサートします。
  • (?=前向き先読み - 一致内で次の一致をアサートします。
    • .*次に何か:
    • status[:=]文字シーケンス"status"の後に":" または "="が続きます。
    • (\S+) キャプチャ グループ -次の非空白シーケンス。

このキャプチャ グループにオプションの空白を提供する場合: status: falsestatus: falseの両方を許可するには、このグループと階下の同じグループを(\s?\S+)!に変更します。

    • | また
    • 何もない。これは、代替がなくても問題ないことを意味します。ただし、何もキャプチャしません。
  • )
  • (?=.*type[:=](\S+)|)このグループを理解してください。上のグループと同じです。
  • (?:.*?title[:=])?オプションの一致:この文字列内の任意の場所で、「タイトル」の後に「:」または「=」が続くようにします。存在する場合は、ポインターをこの位置に移動します。存在しない場合は、バックトラックしてこのグループを失敗させます。
  • (?|ブランチのリセット - 次の変更には同じキャプチャ グループ ID を使用します。
    • "([^"]+)"ポインターの位置が引用符と一致する場合は、その中のすべてを次の引用符まで一致させようとします。Capturing Group : これにより、その中のすべてがキャプチャされ、ブランチ リセット グループが終了します。
    • | また
    • (キャプチャ グループを開きます。
      • (?:グループ。
        • (?!否定先読み - 次のものではないことを表明します。
          • \s?(?:type|status))オプションの空白の後に"type"または"sequence"が続きます。
          • .次に、文字を一致させます。
        • )+なくなるまで繰り返します。
    • ))2 つのグループを閉じます。

(理論上、次の要素は冗長です。)

  • [^"]*残りの行を食べます。現時点では特に問題ありません。
  • $String の末尾の位置をアサートします。

\nデモのは、複数行の要素のためにそこにありました。あなたの実際の使用のために、あなたはそれを持っていません。

于 2014-08-14T00:08:25.200 に答える