首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式匹配,具有负前瞻和非贪婪

正则表达式匹配,具有负前瞻和非贪婪
EN

Stack Overflow用户
提问于 2017-07-25 20:45:52
回答 2查看 1.5K关注 0票数 1

源串

代码语言:javascript
复制
<html name="abc:///Testers/something.txt" in="abc/Testers/something.txt" loci="123" sap="abcdefgh="/><html name="abc:///needed.txt" src="abc/needed.txt" location="123" sap="rtyghu"/><html name="abc:///Testers/Testers3/Another.txt" in="abc/Testers/Testers3/Another.txt" loci="123" sap="jhkiopjhg"/><html name="abc:///onemore.txt" src="abc/onemore.txt" location="123" sap="dfrtyu"/>

如何匹配从<html name=" not followed by (needed) or (onemore) and ending with />开始的部分

所以在这个字符串中应该有两个匹配项,分别是

代码语言:javascript
复制
<html name="abc:///Testers/something.txt" in="abc/Testers/something.txt" loci="123" sap="abcdefgh="/>
<html name="abc:///Testers/Testers3/Another.txt" in="abc/Testers/Testers3/Another.txt" loci="123" sap="jhkiopjhg"/>

我试过了- <html name=(?!(needed|onemore)).*?"\/>

它不工作,因为我混淆了非贪婪和消极的前瞻东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-25 21:05:42

除了对应该放弃遍历的位置进行限制外,您还需要使用重复量词:

代码语言:javascript
复制
<html\s+name="(?![^"]*(?:needed|onemore))[^>]*>

Live demo

票数 4
EN

Stack Overflow用户

发布于 2017-07-25 21:13:21

下面是您的正则表达式<html name=(?!(needed|onemore)).*?"\/>的细目

代码语言:javascript
复制
<html name=(?!(needed|onemore)).*?"\/>
1) Literal match: <html name=
2) Not followed by: "needed" or "onemore"
3) Lazy grab all: .*?
  Until Literal match: "/>

您需要做的是使用另一个像这样的<html name=(?:(?!(needed|onemore)).)*?"\/>分组来检查每个字符抓取是否需要或多个字符。这将检查在每个字符抓取中是否紧跟着"needed“或"onemore”。(我还建议使用[^>]而不是.,这样您就不需要惰性量词了。)

但是,我建议您在过滤<html name=([^>no]|n(?!eeded)|o(?!nemore))*>时使用类似这样的东西。更容易适应,并且对正则表达式引擎的工作更少。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45303746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档