regex - 空白 - 正規表現 記号以外




正規表現:文字列内の2つのタグ間でサブ文字列を引き出す (6)

Perlでは、あなたが望むデータを()で囲み、後で取り出すことができます。他の言語にも同様の機能があります。

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}

私は次の形式のファイルを持っています:

Data Data
Data
[Start]
Data I want
[End]
Data

Regexを使って[Start] [End]タグと[End]タグの間からData I wantを取得したいと思います。 誰が私にこのことをどうやって見せてもらえますか?



正規表現を使って一致するタグを見つけるという落とし穴の詳細については、 http://faq.perl.org/perlfaq4.html#How_do_I_find_matchihttp://faq.perl.org/perlfaq4.html#How_do_I_find_matchi 。 特に、ネストしたタグでは、正しく解釈されるためには本格的なパーサが本当に必要であることに注意してください。

前述のように質問に答えるには、大文字小文字の区別をオフにする必要があることに注意してください。 perlでは、それはi修飾子です:

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

他のトリックは、 *を使用することですか? 捕獲されたマッチの貪欲さを消す量子。 たとえば、一致しない[end]タグがある場合は次のようになります。

Data Data [Start] Data i want [End] Data [end]

おそらくキャプチャしたくないでしょう:

 Data i want [End] Data

正規表現を使用して開始タグと終了タグの間のデータを解析することができますが、これがダウンしたいパスであるかどうかを長く考えなければなりません。 その理由は、ネストするタグの可能性があります。ネストするタグがこれまでに発生する可能性がある場合、またはこれまでに発生する可能性がある場合、その言語はもはや規則的ではないと言われ、正規表現は解析するための適切なツールでなくなります。

PCREやperlの正規表現などの多くの正規表現の実装は、この荒い効果を達成するために使用できるバックトラッキングをサポートしています。 しかし、PCRE(perlとは違って)は無制限のバックトラッキングをサポートしていないので、タグが多すぎるとすぐに奇妙な方法で物事が壊れる可能性があります。

非常に一般的に引用されているブログ記事があります。詳しくはhttp://kore-nordmann.de/blog/do_NOT_parse_using_regexp.htmlご覧ください。現在キャッシュをチェックしていますが、ダウンタイムがあるようです)


$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

私はしばらくの間同じような問題を抱えていましたが、私はこの方法がうまくいっていると言います


\[start\](.*?)\[end\]

Zhich'llはキャプチャ内のテキストを中央に配置します。







parsing