Skip to main content
 首页 » 编程设计

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

2024年04月17日11langtianya

我正在寻找一个正则表达式来匹配 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 - 我在第一次更新中尝试使用正则表达式来捕获所有换行符时运气不佳...如果您这样做,请告诉我。