正则表达式匹配不包含字符串的字符串

时间:2016-01-15 17:23:39

标签: html regex

我想在<span...>的html中替换所有<span id="...(包括<span class="...<span>),除非跨度以<span id="textmarker开头(对于示例我不想保留此范围:<span attr="blah" id="textmarker">

我已经尝试了正则表达式提出的herehere,我终于提出了这个正则表达式永远不会返回<span id="textmarker,但不知何故它有时会错过其他跨度:

<span(?!.*? id="textmarker).*?">

您可以在此处查看我的(简体)html:https://regex101.com/r/yT9jG2/2

奇怪的是,如果我在notepad ++中运行正则表达式,它会返回3个匹配项(第二段中的三个跨度),但regex101只返回1个匹配项。 Notepad ++和regex101都错过了第一段的范围。

这个正则表达式也不会返回它应该的每个跨度(参见带有灰色高光的跨度here

<span(?![^>]*? id="textmarker)[^>]*?>

1 个答案:

答案 0 :(得分:2)

已更新:要在id="textmarker和所有其他id="anythingelse包括span时排除(<span(?! *id="textmarker)[^>]*>)

version 2

在您发布的示例位于:https://regex101.com/r/yT9jG2/2,在顶部,选择(<span(?! *id="textmarker)[^>]*>),设置字段:

  • 字段1:g
  • 字段2,(允许您设置修饰符的较小字段):version 2

使用您的示例并选择id="textmarker,匹配9并在右侧列出它们,包括空跨度和非<span id="YellowType">,例如(

说明

第1场:

  • 可选:)(。为了教育目的,在表达式中添加了一个额外的外括号,仅用于利用regex101的匹配组列表功能在右窗格中列出结果以及匹配的默认内联突出显示。使用Notepad++时,您当然可以省略这些外) <span个括号。
  • <span:匹配(?!
  • *为以下内容启动否定前瞻声明,
  • id="textmarker意味着空间为零或更多次,以防您有额外的空格
  • 后跟)
  • [^结束否定前瞻声明
  • 所以如果匹配看到负前瞻断言,它会自动将其作为匹配丢弃
  • not of of the following启动排除设置。所以>,以下是]
  • *停止定义排除
  • [^>]以匹配前面的0次或更多次。前面是>
  • g以匹配open-a-span标记的结尾

Field 2

  • jmh告诉regex101你希望这是一场贪婪的比赛
  • 所以结果不会在第一场比赛时停止,但会有所有比赛