regex - 正则表达式匹配 <content> 标记内的每个换行符 (\n)

标签 regex

我正在寻找一个正则表达式来匹配 XML 标记内的每个换行符 ( \n ),即 <content> ,或 <content> 内的任何标签内标签,例如:

<blog>
<text>
(Do NOT match new lines here)
</text>
<content>
(DO match new lines here)
<p>
(Do match new lines here)
</p>
</content>
(Do NOT match new lines here)
<content>
(DO match new lines here)
</content>

最佳答案

实际上...你不能在这里使用简单的正则表达式,至少不能。您可能需要担心评论!有人可能会写:

<!-- <content> blah </content> -->

您可以在这里采取两种方法:

  1. 首先删除所有注释。然后使用正则表达式方法。
  2. 不要使用正则表达式,而使用上下文相关的解析方法,该方法可以跟踪您是否嵌套在评论中。

小心。

我也不太确定你可以一次匹配所有新行。 @Quartz 建议这个:

<content>([^\n]*\n+)+</content>

这将匹配在结束标记之前有换行符的任何内容标记...但我不确定您所说的匹配所有换行符是什么意思。您希望能够访问所有匹配的换行符吗?如果是这样,最好的办法是获取所有内容标签,然后搜索嵌套在其间的所有换行符。更像这样:

<content>.*</content>

但有一个警告:正则表达式是贪婪的,所以这个正则表达式将匹配第一个开始标签到最后一个结束标签。相反,你必须抑制正则表达式,这样它就不会贪婪。在像Python这样的语言中,你可以用“?”来做到这一点。正则表达式符号。

我希望您能够看到一些陷阱并弄清楚您想要如何继续。您最好使用 XML 解析库,然后迭代所有内容标签。

我知道我可能无法提供最佳解决方案,但至少我希望您能看到其中的困难以及为什么其他答案可能不正确......

更新1:

让我再总结一下,并在我的回复中添加更多细节。我将使用 python 的正则表达式语法,因为这是我更习惯的语法(请提前原谅我...您可能需要转义一些字符...对我的帖子发表评论,我会更正它):

要删除注释,请使用以下正则表达式: 注意“?”抑制 .* 以使其非贪婪。

同样,要搜索内容标签,请使用: .*?

此外,您也许可以尝试一下,并使用匹配对象 groups() 访问每个换行符:

<content>(.*?(\n))+.*?</content>

我知道我的转义失败了,但它捕获了这个想法。最后一个例子可能行不通,但我认为这是表达你想要的内容的最佳选择。我的建议仍然是:要么获取所有内容标签并自己完成,要么使用解析库。

更新2:

这里是应该可以工作的Python代码。我仍然不确定“查找”所有换行符是什么意思。你想要整条线吗?或者只是计算有多少换行符。要获取实际行,请尝试:

#!/usr/bin/python

import re

def FindContentNewlines(xml_text):
    # May want to compile these regexes elsewhere, but I do it here for brevity
    comments = re.compile(r"<!--.*?-->", re.DOTALL)
    content = re.compile(r"<content>(.*?)</content>", re.DOTALL)
    newlines = re.compile(r"^(.*?)$", re.MULTILINE|re.DOTALL)

    # strip comments: this actually may not be reliable for "nested comments"
    # How does xml handle <!--  <!-- --> -->. I am not sure. But that COULD
    # be trouble.
    xml_text = re.sub(comments, "", xml_text)

    result = []
    all_contents = re.findall(content, xml_text)
    for c in all_contents:
        result.extend(re.findall(newlines, c))

    return result

if __name__ == "__main__":
    example = """

<!-- This stuff
ought to be omitted
<content>
  omitted
</content>
-->

This stuff is good
<content>
<p>
  haha!
</p>
</content>

This is not found
"""
    print FindContentNewlines(example)

该程序打印结果:

 ['', '<p>', '  haha!', '</p>', '']

第一个和最后一个空字符串来自紧邻第一个 <p> 之前的换行符。以及紧随 </p> 之后的一个。总而言之,这(在大多数情况下)可以解决问题。尝试此代码并根据您的需求进行改进。打印出中间的内容,以便您可以看到正则表达式匹配和不匹配的内容。

希望这有帮助:-)。

PS - 我在第一次更新中尝试使用正则表达式来捕获所有换行符时运气不佳...如果您这样做,请告诉我。

关于regex - 正则表达式匹配 <content> 标记内的每个换行符 (\n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1117807/

相关文章:

java - 正则表达式 - 我可以缩短这个表达式吗?

regex - 如何在不解释元字符的情况下将变量用于正则表达式模式?

regex - Google 标签管理器服务器端自定义客户端正则表达式问题

regex - 识别文字引用的正则表达式

javascript - 如何在 jquery 中用多个字符串作为分隔符拆分一个字符串

正则表达式仅匹配正斜杠

c# - 如何避免特定字符串模式被 Regex.replace () 替换

django - 语法正则表达式无效

javascript - 正则表达式将括号内的所有双引号替换为单引号

ruby - 用换行符替换管道字符 "|"?