正则表达式:匹配第 n 次出现
RegEx: Match nth occurrence
我有以下字符串:
_name=aVlTcWRjVG1YeDhucWdEbVFrN3pSOHZ5QTRjOEJZZmZUZXNIYW1PV2RGOWYrczBhVWRmdVJTMUxYazVBOE8zQ3JNMmNVKzJLM2JJTzFON3FiLzFHUE0xY0pkdz09LS1jbkkwaWoxUUl3YVhMMkhtZHpaOW13PT0"%"3D--57356371d167f"
我想匹配 =
和结尾 "
之间的所有内容(注意这之后还有其他引号,所以我不能只 select 最后一个"
).
我尝试使用 _name=(.*?)"
但字符串中还有其他引号。有没有办法匹配第三个引号?我试过 _name=(.*?)"{3}
但 {3}
背靠背匹配引号,即 """
你可以试试here
如果想要匹配第一个和第三个(!)双引号之间的所有内容(第三个不一定是最后一个,你告诉过),你可以使用这样的模式:
$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
原回答:
我不确定我是否理解正确,但听起来你想要执行所谓的 贪婪匹配,这意味着你想要匹配字符串直到最后一个"
不管字符串是否包含多个"
.
要执行贪心匹配,只需删除 ?
,如下所示:
_name=(.*)"
您可以在这里尝试:https://regex101.com/r/uC5eO9/2
您可以使用这个正则表达式:
\b_name=(?:[^"]*"){3}
正则表达式详细信息:
\b_name
: 匹配全词 _name
:
=
:匹配一个=
(?:[^"]*"){3}
:匹配 0 个或多个后跟 "
的非 "
字符。重复这组3次。
我有以下字符串:
_name=aVlTcWRjVG1YeDhucWdEbVFrN3pSOHZ5QTRjOEJZZmZUZXNIYW1PV2RGOWYrczBhVWRmdVJTMUxYazVBOE8zQ3JNMmNVKzJLM2JJTzFON3FiLzFHUE0xY0pkdz09LS1jbkkwaWoxUUl3YVhMMkhtZHpaOW13PT0"%"3D--57356371d167f"
我想匹配 =
和结尾 "
之间的所有内容(注意这之后还有其他引号,所以我不能只 select 最后一个"
).
我尝试使用 _name=(.*?)"
但字符串中还有其他引号。有没有办法匹配第三个引号?我试过 _name=(.*?)"{3}
但 {3}
背靠背匹配引号,即 """
你可以试试here
如果想要匹配第一个和第三个(!)双引号之间的所有内容(第三个不一定是最后一个,你告诉过),你可以使用这样的模式:
$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
原回答:
我不确定我是否理解正确,但听起来你想要执行所谓的 贪婪匹配,这意味着你想要匹配字符串直到最后一个"
不管字符串是否包含多个"
.
要执行贪心匹配,只需删除 ?
,如下所示:
_name=(.*)"
您可以在这里尝试:https://regex101.com/r/uC5eO9/2
您可以使用这个正则表达式:
\b_name=(?:[^"]*"){3}
正则表达式详细信息:
\b_name
: 匹配全词_name
:=
:匹配一个=
(?:[^"]*"){3}
:匹配 0 个或多个后跟"
的非"
字符。重复这组3次。