正则表达式始终匹配第一组' first' (之前)其他组

时间:2017-05-21 13:59:14

标签: php regex

很抱歉这个愚蠢的问题,我很确定正则表达式需要先行/后视和\G锚点,但我无法找到解决方案。在此先感谢您的帮助。

我有这个字符串:

(:xyz:) word word [match1] word word [match2] word [match...] word ...

我需要这个结果:

Match 1:
Group 1 = xyz
Group 2 = match1
Match 2:
Group 1 = xyz
Group 2 = match2
Match 3:
Group 1 = xyz
Group 2 = match...

3 个答案:

答案 0 :(得分:0)

你可以使用lookbehind:

for (var i = 0; i < Xrm.Page.data.process.getActivePath().getLength(); i++) {
   currentStage = Xrm.Page.data.process.getActiveStage();
   if (currentStage && currentStage.getName() == "lastStage") return;
   Xrm.Page.data.process.moveNext();
}

但是你只能用几种语言来做这件事,比如C#或VB.NET。或者在Java中,如果您为lookbehind指定字符的最大限制(例如(?<=\(:(xyz):\).*)\[(.*?)\] 而不是.{0,100})。

答案 1 :(得分:0)

您可以将此正则表达式与\G边界匹配器一起使用:

(?:\(:([^:]+):\)|\G(?!^)).*?\[([^\]]+)\]

RegEx Demo

  • (?:\(:([^:]+):\)|\G(?!^))将使用\G锚点匹配我们的第一个捕获组或上一个匹配结束。
  • .*?\[([^\]]+)\]将匹配&amp;从[...]之间的第二组捕获文本。

<强>代码:

$re = '/(?:\(:([^:]+):\)|\G(?!^)).*?\[([^\]]+)\]/';
$str = '(:xyz:) word word [match1] word word [match2] word [match...] word ...';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result

$match1 = "";
foreach($matches as $val) {
  //print_r($val);
  if (!empty($val[1])) {
    $match1 = $val[1];
  }
  echo "Match " . (++$i) . ":\n";
  echo "Group 1 = " . $match1 . "\n";
  echo "Group 2 = " . $val[2] . "\n";
}

Code Demo

答案 2 :(得分:0)

Lookahead不仅限于固定的字符串长度,在某些情况下(包括此内容),我们可以滥用这一事实。

getUrl(callback)
request.get('http://thecatapi.com/api/images/get?format=src&type=jpg', 
function () {
  callback(this.href)
})