正则表达式匹配(替换)跨度标签之间单词中所有出现的双引号

Posted

技术标签:

【中文标题】正则表达式匹配(替换)跨度标签之间单词中所有出现的双引号【英文标题】:Regex match (replace) all occurrences of double quotes in words between span tags 【发布时间】:2021-12-16 20:04:35 【问题描述】:

我正在尝试替换两个跨度标签之间所有出现的 "。

我用:

(?<=<span>[a-zA-Z0-9_æøåÆØÅ_,.;:!#€%&\/()$§'])*(\")(?=[a-zA-Z0-9_æøåÆØÅ_,.;:!#€%&\/()$§']*<\/span>)

寻找字母+特殊字符

找到“

字母+特殊字符的前瞻

但是使用 html 字符串

<span>d"s"s"</span>

它只匹配最后一次出现的“

如何匹配(最终替换)标签中所有出现的双引号?

提前致谢。

【问题讨论】:

必须是正则表达式吗? 我更喜欢它,因为我已经抓取/匹配了所有跨度标签及其内容,然后再查看每个标签,检查“ 【参考方案1】:

不要打扰后面的样子。相反,匹配",其中&lt;/span&gt; 紧随其后,但没有找到早于&lt;/span&gt;&lt;span&gt;,即" 一个跨度打开/关闭对:

"(?=((?!<span>).)*<\/span>)

见live demo。

分解正则表达式:

" 文字引用 (?!&lt;span&gt;).&lt;&lt;span&gt; 之外的任何字符 ((?!&lt;span&gt;).)* 最多但不包括 &lt;&lt;span&gt; 的任何字符 (?=((?!&lt;span&gt;).)*&lt;\/span&gt;) 后跟在 &lt;span&gt; 之前遇到 &lt;/span&gt; 的输入

【讨论】:

Ecellent,它运行良好,但在以下情况下也有第二个捕获组:"Mads"lkdjff 它也选择一些“正常”字母 -但这已经足够了:-) @Pedellen 正则表达式仅使用单引号字符。正则表达式中的其他所有内容都是向前看(其中包含负面的向前看),并且环顾四周不会消耗或捕获。此正则表达式未捕获任何组。【参考方案2】:

使用

/(?<=<span>[^<>]*)"(?=[^<>]*<\/span>)/g

见regex proof。

解释

--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    <span>                   '<span>'
--------------------------------------------------------------------------------
    [^<>]*                   any character except: '<', '>' (0 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    [^<>]*                   any character except: '<', '>' (0 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    <                        '<'
--------------------------------------------------------------------------------
    \/                       '/'
--------------------------------------------------------------------------------
    span>                    'span>'
--------------------------------------------------------------------------------
  )                        end of look-ahead

【讨论】:

嗯,好像没用?不捕获任何 " 字符?

以上是关于正则表达式匹配(替换)跨度标签之间单词中所有出现的双引号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式模式匹配第一个和最后一个标记之间的单词,第一个单词是常量

PHP:正则表达式替换,同时忽略html标签之间的内容

如何在正则表达式中匹配多个单词

Emacs 正则表达式 wordWord 边界(特别是关于下划线)

如何匹配以下字符串,但不包括JS中的单词字符与正则表达式?

正则表达式——7.4 单词边界