首页 文章

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

提问于
浏览
2

我希望用 <span> 替换html中的所有 <span...> (包括 <span id="...<span class="... ),除非 Span 以 <span id="textmarker 开头(例如我不想保留此范围: <span attr="blah" id="textmarker">

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

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

你可以在这里看到我的(简化)html:https://regex101.com/r/yT9jG2/2

奇怪的是,如果我在记事本中运行正则表达式,则返回3个匹配项(第二段中的三个 Span ),但regex101仅返回1个匹配项 . 记事本和regex101都错过了第一段中的 Span .

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

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

1 回答

  • 1

    Updated: 在包括 id="anythingelse 和所有其他 span 时排除 id="textmarker

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

    在您发布的示例位于:https://regex101.com/r/yT9jG2/2,并在顶部,选择 version 2 ,设置字段:

    • 字段1: (<span(?! *id="textmarker)[^>]*>)

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

    使用您的示例并选择 version 2 ,匹配9并在右侧列出它们,包括空 Span 以及非 id="textmarker ,例如 <span id="YellowType">

    解释

    领域1:

    • 可选: () . 为了教育目的,在表达式中添加了一个额外的外括号,只是为了利用regex101的匹配组列表功能在右窗格中列出结果以及匹配的默认内联突出显示 . 当使用Notepad++时,您当然可以省略这些外部 ( ) 括号 .

    • <span :匹配 <span

    • (?! 为以下内容启动否定先行断言,

    • * 意味着空间为零或更多次,以防您有额外的空格

    • 后跟 id="textmarker

    • ) 结束负前瞻断言

    • 所以如果匹配看到负前瞻断言,它会自动将其作为匹配丢弃

    • [^ 启动排除集 . 所以 not of of the following ,以下是 >

    • ] 停止定义排除

    • * 以匹配前面的0次或更多次 . 前面是 [^>]

    • > 以匹配open-a-span标记的结尾

    领域2

    • g 告诉regex101你希望这是一场贪婪的比赛

    • 所以结果不会在第一场比赛时停止,但会有所有比赛

相关问题