首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

正则表达式: 最短匹配有关问题

2012-02-02 
正则表达式: 最短匹配问题设定要从一个字符串中查找到最短匹配:比如: 字符串为 Font colorred红色字f

正则表达式: 最短匹配问题
设定要从一个字符串中查找到最短匹配:
比如: 字符串为 "<Font color=red>红色字<font color=blue>蓝色字</font>红色字结束</font>"
现在要查找到以真正匹配的 font 标记对,就需要用最短匹配,
即为找到: <font color=blue>蓝色字</font>
也就是: 以 "<font" 开头, 以 "</font>" 结束的最短匹配

用循环的方法肯定可以找到,
我也找到了一种相对复杂的正则表达式方法(单表达式),
看看大家能不能提出采用单一表达式的更好的方法、更有效的方法。


[解决办法]
我抛砖引玉吧(我用Python,不过表达式应该是通用的):

Python code
import res = '<Font color=red>红色字<font color=blue>蓝色字</font><Font color=red>红色字</font>红色字结束</font>'reg = re.compile(r'(<font(?:(?!<font)(?<!</font>).)*</font>)', re.I)for each in reg.findall(s):    print each
[解决办法]
我认为简单且内满足lz需要的方法就是让正则的量词保持非贪婪模式即可。

Python code
# -*- encoding: gb2312 -*-import res = '<Font color=red>红色字<font color=blue>蓝色字</font><Font color=red>红色字</font>红色字结束</font>'reg = re.compile(r'(<font.*?</font>)')for si in reg.findall(s):    print si
[解决办法]
try:
Perl code
(?si)<font\b(?:(?!=\bfont\b).)*</font>
[解决办法]
更正一下:
Perl code
(?si)<font\b(?:(?!=.*<font\b).)*?</font>
[解决办法]
探讨

再次更正:
Perl code
(?sin)<font\b((?!<font\b).)*?</font>

[解决办法]
探讨
来个简单的


'<font[^<]+</font>'

[解决办法]
JScript code
var str = "<Font color=red>红色字<font color=blue>蓝色字</font>红色字结束</font>";    alert(str.match(/<font\b[^>]*>(?:.(?!<font))*?<\/font>/img));
[解决办法]
PHP code
r'<(?P<tagname>\w+)\s*\S*>(?<!</(?P=tagname)>)(.(?!<(?P=tagname)))+?</(?P=tagname)>' 

热点排行