3

次の要件を持つ正規表現を作成する必要があります。

与えられたサンプル テキスト:

SEARCH_TERM_#1 find this text SEARCH-TERM_#2_more text_SEARCH-TERM_#3
SEARCH_TERM_#1 find this text SEARCH-TERM_#3

find this textエリアに出現する文字列を抽出したい

SEARCH_TERM_#1正規表現は、 uptoの後にデータを収集する必要がありSEARCH_TERM_#2ますSEARCH-TERM_#3。#2 と #3 のうち最初に見つかったものを「右側」の検索境界として選択する必要があります。

私は試してみまし(?>SEARCH_TERM_#2|SEARCH_TERM_#3) (?=(?>SEARCH_TERM_#2|SEARCH_TERM_#3))(?>(?=SEARCH_TERM_#2)|(?=SEARCH_TERM_#3))。そして、それらはすべて、収集されたデータに 2 番目の検索用語を含め、3 番目の前に停止しますが、収集されたデータは、最初に来る #2 または #3 の前に停止したいと考えています。

4

2 に答える 2

6

説明

この正規表現は次のようになります。

  • 最初を見つけるSEARCH_TERM_#1
  • 後に始まるテキストをキャプチャSEARCH_TERM_#1
  • SEARCH_TERM_#2またはSEARCH_TERM_#3(どちらか早い方) に遭遇したときにテキストのキャプチャを停止します。

^.*?SEARCH_TERM_\#1((?:(?!SEARCH-TERM_\#2|SEARCH-TERM_\#3).)*)

ここに画像の説明を入力

エキスパンド

  • ^文字列の先頭に一致します。これにより、検索が先頭から開始されます
  • .*?次の式までのすべての文字に一致します。sこの用語は、ドットを改行文字に一致させるオプションと組み合わせて使用​​する必要があることに注意してください
  • SEARCH_TERM_\#1最初の検索語
  • (キャプチャ グループを開始します。この一連の括弧は、一致した値をキャプチャ グループ 1 に入れます。
  • (?:SEARCH-TERM_\#2非キャプチャグループを開始します。これは本当の魔法であり、基本的に、含まれている式がまたはのいずれかにつまずくまで一致し続けることを可能にしますSEARCH-TERM_\#3
    • (?!否定的な先読みを開始します。入力文字列を介してカーソルを移動する正規表現エンジンを考えてみてください。ルーハヘッドは、カーソルを移動せずに、カーソルの後の文字を見るだけです。否定は、見つかった式が一致したとして解決された場合は一致を拒否するか、式が見つからない場合は一致を許可することを意味します。
    • SEARCH-TERM_\#2|SEARCH-TERM_\#3いずれかの値を探します。これ|は「または」ステートメントです
    • )否定的な先読みを閉じる
    • .任意の文字に一致します。式は、前の否定先読みで検索語が見つからなかった場合にのみ、この場所に到達します。
    • )非キャプチャ グループを閉じます。この時点で、#2 または #3 の終了条件に遭遇したか、非キャプチャ グループが単一の文字を検出したため、検索が停止しました。
  • *すべての文字を貪欲に一致させ続けます。終了条件が式の中に含まれているため、greedy を使用できます。
  • )キャプチャ グループを閉じる

    PHP コード例

言語を指定しなかったため、この PHP の例は、その動作を示すためだけに含めています。

入力テキスト

skip this text SEARCH_TERM_#1 find this text SEARCH-TERM_#2 more text to ignore SEARCH_TERM_#3

コード

<?php
$sourcestring="your source string";
preg_match('/^.*?SEARCH_TERM_\#1((?:(?!SEARCH-TERM_\#2|SEARCH-TERM_\#3).)*)/ims',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

マッチ

$matches Array:
(
    [0] => skip this text SEARCH_TERM_#1 find this text 
    [1] =>  find this text 
)

実際の例

または、コメントに含まれている実際の例を使用するには:

正規表現:^.*?style="background-image: url\(((?:(?!&cfs=1|\)).)*)

入力テキスト:<a href=http://i.like.kittens.com style="background-image: url(http://I.like.kittens.com?Name=Boots&cfs=1)">

一致:

[0] => <a href=http://i.like.kittens.com style="background-image: url(http://I.like.kittens.com?Name=Boots
[1] => http://I.like.kittens.com?Name=Boots

免責事項

これは、正規表現を使用して HTML を解析する際の一般的な問題のように見えます。入力テキストが HTML の場合は、正規表現ではなく HTML 解析ツールを使用して調査する必要があります。

于 2013-06-23T05:01:52.163 に答える