Regex Can';不匹配正则表达式
我有一个文件,上面有很多重复的块,就像这样Regex Can';不匹配正则表达式,regex,Regex,我有一个文件,上面有很多重复的块,就像这样 <li> <span>תמונה מאירוע</span> <a href="images/gallerys/events/big/109.jpg" title="תמונה מאירוע"><img src="images/gallerys/events/thumbnails/109.jpg" alt="cars" /> </a> </li> 问题返回给我,从第一
<li>
<span>תמונה מאירוע</span>
<a href="images/gallerys/events/big/109.jpg"
title="תמונה מאירוע"><img
src="images/gallerys/events/thumbnails/109.jpg" alt="cars" />
</a>
</li>
问题返回给我,从第一个href到最后一个src的文本在您的示例中没有
'
。在本例中,title属性位于新行中,因此您永远无法正确匹配它。这些只是几个例子,但还有很多要处理的问题,用纯regexp是不可能做到的
无论您使用哪种语言(可能除了bash/sed/awk…家族),它都将支持将HTML解析为DOM树,使用它您可以轻松找到所需的节点
注意:正如其他人指出的,问题之一是
*
是贪婪的,这意味着它将尽可能多地吃掉我们的字符。如果您真的很固执,可以使用非贪婪版本*?
或类似[^']*
Javascript实现的字符集匹配来解决这个问题
var m,
pairs = [],
rex = /<li>[\s\S]*?<a href="([^"]+)"[\s\S]+?<img\s+src="([^"]+)"/g,
str = '<li>\n' +
'<span>תמונה מאירוע</span>\n' +
'<a href="images/gallerys/events/big/109.jpg"\n' +
'title="תמונה מאירוע"><img\n' +
'src="images/gallerys/events/thumbnails/109.jpg" alt="cars" />\n' +
'</a>\n' +
'</li>';
while ( m = rex.exec( str ) ) {
pairs.push( [ m[1], m[2] ] );
}
console.log( pairs );
var m,
成对=[],
rex=/[\s\s]*?\n'+
“ ”;
while(m=rex.exec(str)){
推送([m[1],m[2]]);
}
控制台日志(对);
假定URL中没有引号
使用合适的HTML解析器会更可靠。您使用什么语言?使您的捕获组不贪婪:
(.*)
->(.*)
。只需解析HTML即可。这会更简单。有可能如此包装字符串,但是,我认为大多数正则表达式引擎都有一个多行标志?/m?
var m,
pairs = [],
rex = /<li>[\s\S]*?<a href="([^"]+)"[\s\S]+?<img\s+src="([^"]+)"/g,
str = '<li>\n' +
'<span>תמונה מאירוע</span>\n' +
'<a href="images/gallerys/events/big/109.jpg"\n' +
'title="תמונה מאירוע"><img\n' +
'src="images/gallerys/events/thumbnails/109.jpg" alt="cars" />\n' +
'</a>\n' +
'</li>';
while ( m = rex.exec( str ) ) {
pairs.push( [ m[1], m[2] ] );
}
console.log( pairs );