XML 中的正则表达式替换

Regexp replace in XML

我是 XML 的新手,没有接受过太多培训。我正在尝试正确格式化自定义报告中的文本。我有这条线:

.replace(/(<([^>]+)>)/ig, "\n")

并且想完全理解它在做什么。我知道新行正在替换括号中的内容。具体来说,这是在找什么?

([^>]+)>)

编辑(来自评论):

这是完整的表达式(为了便于阅读而重新格式化)。

<expression name="expression" type="javascript">
  (
    dataSetRow["Question_Employee_Comment"] +
    dataSetRow["Question_‌​Manager_Comment"]
  )
    .replace(/(&lt;([^>]+)>)/ig, "\n")
    .replace(/null/ig, "")
    .replace(/&amp;amp;/g, "&amp;")
    .replace(/&amp;#39;/g,"'")
    .replace(/&amp;nbsp;/g," ")
    .replace(/•/g,'\n•')
</expression>

这里是这个表达式正在查看的 XML(为便于阅读而换行):

<wd:Question_Employee_Comment>
    &lt;p>I don't even know where to start... Cupid wasn't @ his desk on 2/14/2015
    and I'm really upset because I've been really patient with his personal needs.
    Santa &amp;amp; I sat him down and have discussed why his attendance is important
    to success.&lt;/p>&lt;p>&lt;/p>&lt;p>He's been absent
    on:&lt;/p>&lt;ul>&lt;li>3/19/15&lt;/li>&lt;li>March 20,
    2015&lt;/li>&lt;li>05/01/2015&lt;/li>/ul>&lt;p>&lt;/p>&lt;p>All
    additional dates will be documented.&lt;/p>
</wd:Question_Employee_Comment>

这个正则表达式(或regexp)可以分解如下。

(&lt;([^>]+)>)

圆括号用于分组。

有时它们被用来记住匹配项以便在以后的工作中使用,尽管我没有看到在这个有限的代码示例中发生的任何证据。

有时它们用于允许多个替代选择(例如 (a|b|c),但我在这里也没有看到。

由于括号在此表达式中没有任何作用,至少在匹配方面没有作用,所以我们忽略它们。剩下的是:

&lt;[^>]+>

其中一半只是要匹配的文字字符。匹配的开头必须是原义的 4 字符字符串 &lt;,字符串的结尾是原义字符 >。中间是唯一的正则表达式位。

[^>]+

方括号表示一个字符class。在一个字符class里面,如果^是第一个字符,这里是反字符class,即,这意味着 "match things that are not these things"。所以,这个字符 class 表示 "match things that are not a >."

字符class后面的+叫做量词,表示"one or more of this thing".

所以,合起来就是"one or more things that are not a >."

整个表达式的意思是:匹配 &lt; 后跟一个或多个不是 > 的东西,然后是 >.

表达式后是两个标志,igi 表示匹配 case-insensitively。它在这里不执行任何操作,因为您的表达式没有按字母顺序排列的匹配字符。 g标志表示全局匹配,即如果输入的匹配项不止一个,则全部匹配,而不是只匹配第一种。

现在,看看您的示例 XML,我相信表达式会进行一些编辑。请注意,您 post 只编辑了 <wd:Question_Employee_Comment> 的内容,但表达式实际上同时作用于 <wd:Question_Manager_Comment> 的内容和 <wd:Question_Manager_Comment> 的内容,如果它有值的话。 <wd:Question_Manager_Comment> 这里我就不评论了,因为你没有post它包含什么。

  1. I don't even 之前的前导 &lt;p> 将被换行符替换。
  2. 就在important to success之后,&lt;/p>&lt;p>&lt;/p>&lt;p>将被4个换行符取代。
  3. 就在absent on之后,&lt;/p>&lt;ul>&lt;li>将被3个换行符取代。
  4. 就在 3/19/15 之后,&lt;/li>&lt;li> 将被 2 个换行符替换。
  5. 就在 March 20, 2015 之后,&lt;/li>&lt;li> 将被 2 个换行符替换。
  6. 就在 5/01/2015 之后,&lt;/li> 将被换行符替换。
  7. 就在 All additional 之前,`

    将被 3 个换行符替换。

  8. 最后,&lt;/p> 会换行。

请注意,表达式 /ul>.

中遗漏了部分标记

结果:

<wd:Question_Employee_Comment>
    \nI don't even know where to start... Cupid wasn't @ his desk on 2/14/2015
    and I'm really upset because I've been really patient with his personal needs.
    Santa &amp;amp; I sat him down and have discussed why his attendance is important
    to success.\n\n\n\nHe's been absent
    on:\n\n\n3/19/15\n\nMarch 20,
    2015\n\n05/01/2015\n/ul>\n\n\nAll
    additional dates will be documented.\n
</wd:Question_Employee_Comment>

这是您特意询问的.replace()。进一步的工作也由完整表达式完成,比如将 &amp;amp; 固定为 &amp;,以及其他一些事情。我没有在这里进行所有这些转换,因为这些不是您提出的核心问题的一部分,但如果您不理解这些部分,可以详细说明。

replace 函数将用换行符替换所有 XML 标签,留下没有任何标记的纯文本。

备注:

  • replace 函数旨在应用于 XML;它不是 XML 本身。
  • 它使用一个正则表达式来匹配一个XML标签。见 丹的 answer 以获得对常规构造的很好描述 表达式。
  • Regex is fundamentally the wrong way to process XML。使用真实的 XML 解析器或 XPath。