【问题标题】:RegEx: Match nth occurrence正则表达式:匹配第 n 次出现
【发布时间】:2015-04-10 21:35:42
【问题描述】:

我有以下字符串:

_name=aVlTcWRjVG1YeDhucWdEbVFrN3pSOHZ5QTRjOEJZZmZUZXNIYW1PV2RGOWYrczBhVWRmdVJTMUxYazVBOE8zQ3JNMmNVKzJLM2JJTzFON3FiLzFHUE0xY0pkdz09LS1jbkkwaWoxUUl3YVhMMkhtZHpaOW13PT0"%"3D--57356371d167f"

我想匹配= 和结尾" 之间的所有内容(注意后面还有其他引号,所以我不能只选择最后一个"

我尝试使用_name=(.*?)",但字符串中还有其他引号。有没有办法匹配第三个报价?我尝试了_name=(.*?)"{3},但{3} 与引号匹配,即"""

你可以试试here

【问题讨论】:

  • "放在括号内。
  • 这仍然只匹配第一个引号

标签: regex pcre


【解决方案1】:

你可以使用这个正则表达式:

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

RegEx Demo

正则表达式详细信息:

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

【讨论】:

  • 此解决方案甚至匹配 _name= 以及我们不想要的所需匹配!所以我们不应该像这样添加一个括号:_name=((?:[^"]*"){3})regex101.com/r/oK0eO2/374如果我弄错了请告诉我?
  • 如果你想在= 之后捕获部分,那么_name=((?:[^"]*"){3}) 似乎是正确的。
【解决方案2】:

如果想匹配第一个和第三个(!)双引号之间的所有内容(您告诉过,第三个不一定是最后一个),您可以使用这样的模式:

$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

原答案:

我不确定我的理解是否正确,但听起来你想要执行所谓的 贪婪匹配,这意味着你想要匹配字符串直到最后一个 ",无论是否该字符串包含多个"s。

要执行贪心匹配,只需删除?,如下所示:

_name=(.*)"

你可以在这里试试:https://regex101.com/r/uC5eO9/2

【讨论】:

  • 这是 curl 请求的一部分。在此之后还有其他报价,但我只是想匹配第三个报价。您的代码将匹配 last 一个不是我想要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2019-07-19
  • 2018-06-28
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多