正则表达式抓取太多文本

Posted

技术标签:

【中文标题】正则表达式抓取太多文本【英文标题】:Regex grabbing too much text 【发布时间】:2014-02-01 22:02:15 【问题描述】:

假设我有以下文字:

foo bar baz <!-- USERNAME --> <!-- ACCESS_KEY --> baz bar foo

<!--:USERNAME-->

<!-- eueuteh -->

 -DarchetypeVersion=<!-- java-version --> -UserName=<!-- :USERNAME --> -DsauceAccessKey=<!-- ACCESS_KEY --> 

我想要做的是将&lt;!-- USERNAME --&gt; 替换为其他文本。不幸的是,我创建的正则表达式实际上并没有按预期工作,例如替换了整个 &lt;!-- java-version --&gt; -UserName=&lt;!-- :USERNAME --&gt; 表达式。前两个事件被正确替换。哪里错了?

这是我所拥有的,在 javascript 控制台中进行测试:

var re = new RegExp('(<!--)(.)*(USERNAME)(.)?(-->)');

【问题讨论】:

问题出在你的(.)* 上,这意味着:匹配任何东西,0 次或更多次,它匹配java-version --&gt; -UserName=&lt;!-- : how to make Regular expression into non-greedy?的可能重复 这是你想要做的吗? regex101.com/r/lI8cV8 @VasiliSyrakis 请发表您的评论作为答案,因为现在它是唯一一个实际工作的 :) 谢谢! 【参考方案1】:

正确的表达方式似乎是

/<!--(.(?!-->))*USERNAME.*?-->/g

【讨论】:

【参考方案2】:

我将以下技术用于 html、XML 和类似的东西(尽管在嵌套内容方面这是不好的做法)

正则表达式

(&lt;[^&gt;]*)(USERNAME)([^&gt;]*&gt;)


演示

http://regex101.com/r/lI8cV8

【讨论】:

以上是关于正则表达式抓取太多文本的主要内容,如果未能解决你的问题,请参考以下文章

用正则表达式抓取豆瓣数据

PYTHON笔记简单的网页爬虫:用正则表达式抓取关键信息

tcl 正则匹配与替换

使用vba做一个正则表达式提取文本工具

简要总结liunx正则表达式

正则表达式必知必会