这个正则表达式:
<IMG\s([^"'>]+|'[^']*'|"[^"]*")+>
当给出这个文本时,似乎无休止地处理
<img src=http://www.blahblahblah.com/houses/Images/
single_and_multi/roof/feb09/01_img_trrnjks_vol2009.jpg' />
我希望它 - 找不到匹配(快速) - 因为文本中只有一个单引号。我已经在C#中使用了Expresso正则表达式工具。如果文字短得多,似乎有效。
答案 0 :(得分:6)
<IMG\s([^"'>]+|'[^']*'|"[^"]*")+>
取出几个分支,开始和结束:
([^"'>]+)+
这有多少种方法可以匹配“你好”?
(hell)(o)
(hel)(lo)
(hel)(l)(o)
(he)(llo)
(he)(l)(lo)
(he)(l)(l)(o)
... and so on
答案 1 :(得分:1)
听起来像正则表达式引擎回溯很多的情况之一。由Friedl掌握正则表达式有一些关于这个主题的好材料。
答案 2 :(得分:0)
其他评论者提到复杂性可能是导致问题的原因。我想补充一点,如果你想尝试匹配类似IMG标签的东西,我想你想要一个更像这样的正则表达式:
<IMG(\s+[a-z]+=('[^']*'|"[^"]*"|[^\s'">]+))+>
当然,这个正则表达式仍然无法捕获有效的HTML变体。像结束/
(在xhtml中需要),或者在结束括号之前的空格。它会传递一些无效的情况,例如不受支持的属性名称。
答案 3 :(得分:0)
我认为这就是你想要的,我认为你长期运行的原因就像其他地方所提到的那样,由于贪婪的非引用或者&gt;引起的极度重复。正在使用字符串处理器(也使用贪婪的[“'&gt;]匹配。
对于正确格式化或格式不正确的标签,这似乎很快就会运行。
<img(\s+((\w+)=(('[^']*?')|("[^"]*?"))))+? />
答案 4 :(得分:0)
您可以发布您正在尝试查找或提取的内容吗?你想弄清楚img标签指向的是什么吗?这将大大增加能够提供更好答案的机会。