【问题标题】:Regexp replace in XMLXML中的正则表达式替换
【发布时间】:2016-01-04 23:00:03
【问题描述】:

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

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

并希望完全了解它在做什么。我知道一个新行正在替换括号中的内容。具体来说,这是在寻找什么?

([^>]+)>)

编辑(来自 cmets):

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

<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>

【问题讨论】:

标签: javascript regex xml birt


【解决方案1】:

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

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

括号用于分组。

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

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

由于括号在这个表达式中没有任何作用,至少没有匹配,让我们忽略它们。剩下的就是:

&lt;[^>]+>

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

[^>]+

方括号表示一个字符类。在一个字符类里面,如果^是第一个字符,就像这里一样,那么它就是一个逆字符类,也就是“匹配的东西em>这些东西”。所以,这个字符类说“匹配不是&gt;的东西。”

字符类后面的+称为量词,意思是“一个或多个这个东西”。

因此,合起来表示“一个或多个不是&gt; 的东西。”

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

表达式后面是两个标志,igi 表示不区分大小写匹配。它在这里没有做任何事情,因为您的表达式没有匹配的字母字符。 g 标志的意思是全局匹配,即如果对输入有多个匹配,则全部匹配,而不是只匹配第一种情况。

现在,看看您的示例 XML,我相信表达式会进行一些编辑。请注意,您仅发布了 &lt;wd:Question_Employee_Comment&gt; 的内容,但表达式实际上是在该内容和 &lt;wd:Question_Manager_Comment&gt; 的内容上运行,如果它有值的话。我不会在这里评论&lt;wd:Question_Manager_Comment&gt;,因为你没有发布它包含的内容。

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

    将被 3 个换行符替换。

  8. 最后,&amp;lt;/p&gt; 将被换行符替换。

请注意,表达式/ul&gt; 遗漏了其中的部分标记。

结果:

<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;固定为&amp;amp;,其他的事情都做完了。我没有在这里进行所有这些转换,因为这些不是您提出的核心问题的一部分,但如果您不理解这些部分,可以详细说明。

【讨论】:

  • 感谢 Dan 如此快速而详细的回复。这段代码现在更有意义了。
  • 这是完整的表达式:code (dataSetRow["Question_Employee_Comment"]+dataSetRow["Question_Manager_Comment"]).replace(/( <([^>]+)>)/ig, "\n").replace(/null/ig, "").replace(/&amp;/g, "&").replace(/ &#39;/g,"'").replace(/&nbsp;/g,"").replace(/•/g,'\n•')表达式>
  • 这是表达式正在查看的 xml:code <p>我什至不知道从哪里开始......丘比特不是@他的办公桌2015 年 2 月 14 日,我真的很沮丧,因为我对他的个人需求非常耐心。圣诞老人&amp;我让他坐下来,讨论了为什么他的出席对成功很重要。</p><p></p><p>他缺席的时间:</p><ul><li >2015 年 3 月 19 日
  • 2015 年 3 月 20 日
  • 05/01/2015
  • /ul>

    将记录所有其他日期。</p>

  • 所以根据我对你的解释的理解,Dan.....the .replace(/<([^>]+)>/ig, "\n") 将添加 2 个新的文本“他一直缺席”前面的行字符……对吗?以及“2015 年 3 月 20 日”文本前面的 3 个换行符?
  • @Sonya 是的,但它的作用不止于此 - 请参阅我的扩展答案。
  • 【解决方案2】:

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

    注意事项:

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签