Regexp替换为XML

时间:2016-01-04 23:00:03

标签: javascript regex xml birt

我是使用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>

2 个答案:

答案 0 :(得分:1)

此正则表达式(或 regexp )可以按如下方式细分。

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

括号用于分组。

有时它们会被用来记住在以后的工作中使用的匹配,但我发现在这个有限的代码示例中没有发现任何证据。

有时他们习惯于允许多种替代选择(例如(a|b|c),但我也不会在这里看到。

由于括号在这个表达式中没有做任何事情,至少没有匹配,所以让我们忽略它们。这留下了:

&lt;[^>]+>

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

[^>]+

方括号表示字符类。在字符类中,如果^是第一个字符,就像它在这里一样,那么它就是反向字符类,也就是说,它意味着“匹配不是这些东西“。所以,这个角色类说“匹配不是>的东西。”

字符类之后的+被称为量词,它意味着“这个东西中的一个或多个”。

因此,合在一起意味着“一件或多件事不是>。”

整个表达方式意味着:匹配&lt;后跟一个或多个非>的内容,后跟>

表达式后面有两个标记igi表示不区分大小写。它在这里没有做任何事情,因为你的表达式没有按字母顺序排列的匹配字符。 g标志表示全局匹配,也就是说,如果输入有多个匹配,则匹配所有匹配,而不是仅匹配第一种情况。

现在,看一下您的示例XML,我相信该表达式会进行大量编辑。请注意,您仅发布了<wd:Question_Employee_Comment>的内容,但该表达式实际上同时对<wd:Question_Manager_Comment>的内容进行操作(如果有值)。我不会在这里评论<wd:Question_Manager_Comment>,因为你没有发布它包含的内容。

  1. &lt;p>之前的前导I don't even将被换行替换。
  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之前,`&lt; p&gt;&lt; / p&gt;&lt; p&gt;将由3个换行符替换。
  8. 最后,&lt;/p>将替换为换行符。
  9. 请注意,表达式/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;,并完成其他工作。我没有在这里进行所有这些转换,因为那些转换不是你提出的核心问题的一部分,但如果你不理解这些部分,可以详细说明。

答案 1 :(得分:1)

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

备注: