パターン間の単語を取得するPerl正規表現

パターン間の単語を取得するPerl正規表現

grepを使って動作するPerl正規表現があります。私はそれがどのように機能するかを理解しようとしています。

以下はコマンドコマンドです。

grep -oP '(?<=location>)[^<]+' testFile1.xml

以下は内容ですtestFile1.xml

<con:location>C:/test/file1.txt</con:location></con:dataFile>/con:dataFiles></con:groupFile>

これが結果です

C:/test/file1.txt

正規表現を理解しようとしています。つまり、(?<=location>)[^<]+

ベストアンサー1

(?<=...)後ろを見てPCRE演算子。それ自体は何も一致しませんが、むしろ条件として機能します(左側にあるものは何でも一致します...)。

(?<=X)Y一致Yの前提は、左側の内容が一致することですX。 inはblahYfooXYbar2番目のものと一致し、Y一致するX項目の一部ではありません。それ自体(?<=X)は幅がゼロのようです(想像)その直前ですY。例は次のとおりです。

$ echo X-RAY THE FOX | perl -lpe 's/(?<=X)/<there>/g'
X<there>-RAY THE FOX<there>

使用時は-o印刷grepのみするのでマッチセクションに何かを印刷する方法は1つあります。後ろにlocation>ここで一致するのは、[^>]+1つ以上の(+<文字ではなく()なので、次の文字または行末(空でない場合)[^>]までのすべてです。<

もう1つの方法は、\K(最新バージョンのPCREで)以下を使用して、一致する部分の開始をリセットすることです。

grep -Po 'location>\K[^>]+'

-Pとは-oGNU拡張です。pcregrep最新バージョン(8.11以降)(他のPCRE実装を使用)の場合は、grep次のこともできます。

pcregrep -o1 'location>([^>]+)'

最初に-o1キャプチャした内容を印刷します(ここでは1つのみ))(...)

おすすめ記事