很抱歉这个愚蠢的问题,我很确定正则表达式需要先行/后视和\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...
答案 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(?!^)).*?\[([^\]]+)\]
(?:\(:([^:]+):\)|\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";
}
答案 2 :(得分:0)
Lookahead不仅限于固定的字符串长度,在某些情况下(包括此内容),我们可以滥用这一事实。
getUrl(callback)
request.get('http://thecatapi.com/api/images/get?format=src&type=jpg',
function () {
callback(this.href)
})