正则表达式:匹配第 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}

RegEx Demo

正则表达式详细信息:

  • \b_name: 匹配全词 _name:
  • =:匹配一个=
  • (?:[^"]*"){3}:匹配 0 个或多个后跟 " 的非 " 字符。重复这组3次。