私の正規表現パターンは次のようになります
<xxxx location="file path/level1/level2" xxxx some="xxx">
場所に割り当てられた見積もりの部分にのみ興味があります。貪欲なスイッチがなければ、以下のように簡単ではないでしょうか?
/.*location="(.*)".*/
動作していないようです。
私の正規表現パターンは次のようになります
<xxxx location="file path/level1/level2" xxxx some="xxx">
場所に割り当てられた見積もりの部分にのみ興味があります。貪欲なスイッチがなければ、以下のように簡単ではないでしょうか?
/.*location="(.*)".*/
動作していないようです。
回答:
正規表現は貪欲でないようにする必要があります。デフォルトで"(.*)"
は、すべてに一致するためです"file path/level1/level2" xxx some="xxx"
。
代わりに、ドットスターを貪欲にしないようにすることができます。これにより、可能な限り少ない文字に一致します。
/location="(.*?)"/
?
量指定子(?
、*
または+
)にを追加すると、貪欲ではなくなります。
.*?
それはだ.\{-}
非欲張りマッチのために。
location="(.*)"
貪欲にしない限りlocation=
、「後」から「後」まで一致しsome="xxx
ます。あなたのように、いずれかの必要性は、.*?
交換するより良いか(つまりは、それが非貪欲作る).*
で[^"]*
。
.*?
表記はより一般的です[^"]*
定量化されたサブパターンを使用していて、Perl Docで説明されているように、
デフォルトでは、定量化されたサブパターンは「貪欲」です。つまり、パターンの残りの部分を一致させながら、(特定の開始位置を指定して)可能な限り何度も一致します。あなたはそれが必要な場合 最小回数と一致する可能性を、数量詞をたどる と「?」。意味は変わらず、「貪欲」だけであることに注意してください。
*? //Match 0 or more times, not greedily (minimum matches)
+? //Match 1 or more times, not greedily
したがって、定量化されたパターンを最小限に一致させるには、次のようにし?
ます。
/location="(.*?)"/
ここに別の方法があります。
ここにあなたが欲しいものがあります。これは怠惰です[\s\S]*?
最初の項目:
[\s\S]*?(?:location="[^"]*")[\s\S]*
置換:$1
説明:https : //regex101.com/r/ZcqcUm/2
完全を期すために、これは最後のものを取得します。これは貪欲です[\s\S]*
最後の項目:[\s\S]*(?:location="([^"]*)")[\s\S]*
置換:$1
説明:https : //regex101.com/r/LXSPDp/3
これら2つの正規表現の違いは1つだけで、それは ?