假设有一个序列...... a ... b ... a ... b ... c ...,其中a,b和c是字符串常量。并且点表示a,b和c之间的任意其他(非a,b或c)符号的任意数量。
我想将“a ... b ... c”匹配为最懒惰的方式(最后一个abc三元组),但正则表达式引擎抓住了更大的“a ... b ... a ... b ......“而且更进一步。
我尝试使用a\w+b\w+(?!a)\w+c
或a\w+b\w+?(?!a)\w+?c
等形式的否定前瞻,但到目前为止没有成功。
答案 0 :(得分:1)
您需要在这三个部分之间使用tempered greedy tokens。
想象一下,jQuery(function() {
var $el, leftPos, newWidth,
$mainNav = jQuery("#menu-main-menu");
$mainNav.append("<li id='magic-line'></li>");
var $magicLine = jQuery("#magic-line");
if( jQuery('#menu-main-menu .current-menu-ancestor').length ) {
var currentPageWidth = jQuery('#menu-main-menu .current-menu-ancestor > a').parent().width();
var currentPageLeft = jQuery('#menu-main-menu .current-menu-ancestor > a').parent().position().left;
}
if( jQuery('#menu-main-menu .current-menu-item').length ) {
var currentPageWidth = jQuery('#menu-main-menu .current-menu-item > a').parent().width();
var currentPageLeft = jQuery('#menu-main-menu .current-menu-item > a').parent().position().left;
}
$magicLine
.width(currentPageWidth)
.css("left", currentPageLeft)
.data("origLeft", $magicLine.position().left)
.data("origWidth", $magicLine.width());
jQuery("#menu-main-menu li").hover(function() {
$el = jQuery(this);
leftPos = $el.position().left;
newWidth = $el.width();
$magicLine.stop().animate({
left: leftPos,
width: newWidth
});
}, function() {
$magicLine.stop().animate({
left: $magicLine.data("origLeft"),
width: $magicLine.data("origWidth")
});
});
jQuery("#menu-main-menu li .sub-menu li").hover(function() {
$magicLine.stop()
}, function() {
$magicLine.stop().animate({
left: $magicLine.data("origLeft"),
width: $magicLine.data("origWidth")
});
});
}, 1500);
为a
,abc
为b
,bff
为c
。然后,你要用
cca
请参阅regex demo
<强>详情:
(?s)abc(?:(?!abc).)*?bff(?:(?!abc).)*?cca
- 与(?s)
或re.S
修饰符相同,使re.DOTALL
匹配换行符.
- 文字字符串abc
或某种模式#1 abc
- 除了换行符之外的任何0 +字符,尽可能少地启动(?:(?!abc).)*?
序列abc
- 文字字符串bff
或某种模式#2 bff
- 见上文(?:(?!abc).)*?
- 文字字符串cca
或某种模式#3 答案 1 :(得分:0)
没有必要为此使用looakarounds。将.*
放在正则表达式的开头,并将要匹配的内容放入捕获组:
.*(a.*b.*c)
然后使用.group(1)
获取捕获组的内容。
一开始贪婪的.*
让这找到了最后一个黑社会。
答案 2 :(得分:-1)
您可能没有意识到您从@WiktorStribiżew中接受的答案 不符合您的要求。
@WiktorStribiżew答案是(?s)a(?:(?!a).)*?b(?:(?!a).)*?c
只要在任何地方都没有a..b..c
,此正则表达式将匹配a
序列
哪里有一个点。
这就是所有这个正则表达式。
然而,它不符合您的要求=&gt;
a...b...c
点和点代表a,b和c之间的其他一些(not a, b or c
)符号的任意数量。
所以,只是没有a
点不能覆盖它
它必须是not a, b or c
正确的方法很简单。这就是为什么我把它放在我的评论中=&gt;
a(?:(?!a|b|c).)*b(?:(?!a|b|c).)*c
是唯一的方法。 http://regex101.com/r/uCDgY4/1
我不希望你通过错误的答案得到 sukered 。
正则表达式扩展
a # 'a'
(?: # Cluster
(?! a | b | c ) # Assert, not a, b or c
. # Valid
)* # End, 0 to many
b # 'b'
(?: # Cluster
(?! a | b | c ) # Assert, not a, b or c
. # Valid
)* # End, 0 to many
c # 'c'