XML 中的正则表达式替换
Regexp replace in XML
我是 XML 的新手,没有接受过太多培训。我正在尝试正确格式化自定义报告中的文本。我有这条线:
.replace(/(<([^>]+)>)/ig, "\n")
并且想完全理解它在做什么。我知道新行正在替换括号中的内容。具体来说,这是在找什么?
([^>]+)>)
编辑(来自评论):
这是完整的表达式(为了便于阅读而重新格式化)。
<expression name="expression" type="javascript">
(
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•')
</expression>
这里是这个表达式正在查看的 XML(为便于阅读而换行):
<wd:Question_Employee_Comment>
<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; I sat him down and have discussed why his attendance is important
to success.</p><p></p><p>He's been absent
on:</p><ul><li>3/19/15</li><li>March 20,
2015</li><li>05/01/2015</li>/ul><p></p><p>All
additional dates will be documented.</p>
</wd:Question_Employee_Comment>
这个正则表达式(或regexp)可以分解如下。
(<([^>]+)>)
圆括号用于分组。
有时它们被用来记住匹配项以便在以后的工作中使用,尽管我没有看到在这个有限的代码示例中发生的任何证据。
有时它们用于允许多个替代选择(例如 (a|b|c)
,但我在这里也没有看到。
由于括号在此表达式中没有任何作用,至少在匹配方面没有作用,所以我们忽略它们。剩下的是:
<[^>]+>
其中一半只是要匹配的文字字符。匹配的开头必须是原义的 4 字符字符串 <
,字符串的结尾是原义字符 >
。中间是唯一的正则表达式位。
[^>]+
方括号表示一个字符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 >
."
整个表达式的意思是:匹配 <
后跟一个或多个不是 >
的东西,然后是 >
.
表达式后是两个标志,i
和g
。 i
表示匹配 case-insensitively。它在这里不执行任何操作,因为您的表达式没有按字母顺序排列的匹配字符。 g
标志表示全局匹配,即如果输入的匹配项不止一个,则全部匹配,而不是只匹配第一种。
现在,看看您的示例 XML,我相信表达式会进行一些编辑。请注意,您 post 只编辑了 <wd:Question_Employee_Comment>
的内容,但表达式实际上同时作用于 <wd:Question_Manager_Comment>
的内容和 <wd:Question_Manager_Comment>
的内容,如果它有值的话。 <wd:Question_Manager_Comment>
这里我就不评论了,因为你没有post它包含什么。
I don't even
之前的前导 <p>
将被换行符替换。
- 就在
important to success
之后,</p><p></p><p>
将被4个换行符取代。
- 就在
absent on
之后,</p><ul><li>
将被3个换行符取代。
- 就在
3/19/15
之后,</li><li>
将被 2 个换行符替换。
- 就在
March 20, 2015
之后,</li><li>
将被 2 个换行符替换。
- 就在
5/01/2015
之后,</li>
将被换行符替换。
- 就在
All additional
之前,` 将被 3 个换行符替换。
- 最后,
</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; 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;
固定为 &
,以及其他一些事情。我没有在这里进行所有这些转换,因为这些不是您提出的核心问题的一部分,但如果您不理解这些部分,可以详细说明。
replace
函数将用换行符替换所有 XML 标签,留下没有任何标记的纯文本。
备注:
replace
函数旨在应用于 XML;它不是 XML
本身。
- 它使用一个正则表达式来匹配一个XML标签。见 丹的
answer 以获得对常规构造的很好描述
表达式。
- Regex is fundamentally the wrong way to process XML。使用真实的
XML 解析器或 XPath。
我是 XML 的新手,没有接受过太多培训。我正在尝试正确格式化自定义报告中的文本。我有这条线:
.replace(/(<([^>]+)>)/ig, "\n")
并且想完全理解它在做什么。我知道新行正在替换括号中的内容。具体来说,这是在找什么?
([^>]+)>)
编辑(来自评论):
这是完整的表达式(为了便于阅读而重新格式化)。
<expression name="expression" type="javascript">
(
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•')
</expression>
这里是这个表达式正在查看的 XML(为便于阅读而换行):
<wd:Question_Employee_Comment>
<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; I sat him down and have discussed why his attendance is important
to success.</p><p></p><p>He's been absent
on:</p><ul><li>3/19/15</li><li>March 20,
2015</li><li>05/01/2015</li>/ul><p></p><p>All
additional dates will be documented.</p>
</wd:Question_Employee_Comment>
这个正则表达式(或regexp)可以分解如下。
(<([^>]+)>)
圆括号用于分组。
有时它们被用来记住匹配项以便在以后的工作中使用,尽管我没有看到在这个有限的代码示例中发生的任何证据。
有时它们用于允许多个替代选择(例如 (a|b|c)
,但我在这里也没有看到。
由于括号在此表达式中没有任何作用,至少在匹配方面没有作用,所以我们忽略它们。剩下的是:
<[^>]+>
其中一半只是要匹配的文字字符。匹配的开头必须是原义的 4 字符字符串 <
,字符串的结尾是原义字符 >
。中间是唯一的正则表达式位。
[^>]+
方括号表示一个字符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 >
."
整个表达式的意思是:匹配 <
后跟一个或多个不是 >
的东西,然后是 >
.
表达式后是两个标志,i
和g
。 i
表示匹配 case-insensitively。它在这里不执行任何操作,因为您的表达式没有按字母顺序排列的匹配字符。 g
标志表示全局匹配,即如果输入的匹配项不止一个,则全部匹配,而不是只匹配第一种。
现在,看看您的示例 XML,我相信表达式会进行一些编辑。请注意,您 post 只编辑了 <wd:Question_Employee_Comment>
的内容,但表达式实际上同时作用于 <wd:Question_Manager_Comment>
的内容和 <wd:Question_Manager_Comment>
的内容,如果它有值的话。 <wd:Question_Manager_Comment>
这里我就不评论了,因为你没有post它包含什么。
I don't even
之前的前导<p>
将被换行符替换。- 就在
important to success
之后,</p><p></p><p>
将被4个换行符取代。 - 就在
absent on
之后,</p><ul><li>
将被3个换行符取代。 - 就在
3/19/15
之后,</li><li>
将被 2 个换行符替换。 - 就在
March 20, 2015
之后,</li><li>
将被 2 个换行符替换。 - 就在
5/01/2015
之后,</li>
将被换行符替换。 - 就在
All additional
之前,`将被 3 个换行符替换。
- 最后,
</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; 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;
固定为 &
,以及其他一些事情。我没有在这里进行所有这些转换,因为这些不是您提出的核心问题的一部分,但如果您不理解这些部分,可以详细说明。
replace
函数将用换行符替换所有 XML 标签,留下没有任何标记的纯文本。
备注:
replace
函数旨在应用于 XML;它不是 XML 本身。- 它使用一个正则表达式来匹配一个XML标签。见 丹的 answer 以获得对常规构造的很好描述 表达式。
- Regex is fundamentally the wrong way to process XML。使用真实的 XML 解析器或 XPath。