web-dev-qa-db-ja.com

RegEx:n番目の出現に一致

次の文字列があります。

__name=aVlTcWRjVG1YeDhucWdEbVFrN3pSOHZ5QTRjOEJZZmZUZXNIYW1PV2RGOWYrczBhVWRmdVJTMUxYazVBOE8zQ3JNMmNVKzJLM2JJTzFON3FiLzFHUE0xY0pkdz09LS1jbkkwaWoxUUl3YVhMMkhtZHpaOW13PT0"%"3D--57356371d167f"
_

_=_と最後の_"_の間のすべてを一致させたい(この後に他の引用符があるため、最後の_"_だけを選択できないことに注意してください) )

_name=(.*?)"を使用してみましたが、文字列内に他の引用符もあります。 3番目の引用と一致する方法はありますか?私は_name=(.*?)"{3}を試しましたが、_{3}_は引用符と連続して一致します。つまり、_"""_

試すことができます こちら

8
Bijan

あなたはこの正規表現を使うことができます:

_name=(?:[^"]*"){3}

RegExデモ

6
anubhava

最初と3番目の二重引用符(!

$string = '_name=foo"bar"test" more text"';
// This pattern will not include the last " (note the 2, not 3)
$pattern = '/_name=((.*?"){2}.*?)"/';

preg_match($pattern, $string, $m);
echo $m[1];

出力:

foo"bar"test

元の答え:

正しく取得できたかどうかはわかりませんが、いわゆるgreedy matchを実行したいようです。つまり、最後の"文字列に複数の"sが含まれているかどうかに関係なく。

貪欲な一致を実行するには、次のように?をドロップするだけです。

_name=(.*)"

ここで試すことができます: https://regex101.com/r/uC5eO9/2

1
hek2mgl