首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配<content>标记内的每个换行符(\n)的正则表达式

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

Stack Overflow用户
提问于 2009-07-13 05:19:14
回答 2查看 403.2K关注 0票数 59

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

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-13 05:40:33

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

代码语言:javascript
复制
<!-- <content> blah </content> -->

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

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

注意。

我也不确定你是否可以一次匹配所有的新行。@Quartz建议这样做:

代码语言:javascript
复制
<content>([^\n]*\n+)+</content>

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

代码语言:javascript
复制
<content>.*</content>

但是有一个警告:正则表达式是贪婪的,所以这个正则表达式将匹配第一个开始标记和最后一个结束标记。相反,您必须抑制正则表达式,这样它才不会贪婪。在python这样的语言中,可以使用"?“正则表达式符号。

我希望通过这篇文章,您可以看到一些陷阱,并弄清楚您想要如何继续。使用XML解析库,然后遍历所有内容标记可能会更好。

我知道我可能没有提供最好的解决方案,但至少我希望你能看到其中的困难,以及为什么其他答案可能不正确……

更新1:

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

要去掉注释,请使用此正则表达式:注意"?“抑制.*以使其非贪婪。

类似地,要搜索内容标记,请使用:.*

此外,您还可以尝试此操作,并使用匹配对象组()访问每个换行符:

代码语言:javascript
复制
<content>(.*?(\n))+.*?</content>

我知道我的越狱已经结束了,但它抓住了我的想法。最后一个例子可能行不通,但我认为这是表达你想要的东西的最佳选择。我的建议仍然是:要么抓取所有的内容标签并自己做,要么使用解析库。

更新2:

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

代码语言:javascript
复制
#!/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)

此程序打印结果:

代码语言:javascript
复制
 ['', '<p>', '  haha!', '</p>', '']

第一个和最后一个空字符串来自紧接在第一个<p>之前和紧跟在</p>之后的换行符。总而言之,这(在很大程度上)起到了作用。尝试使用此代码,并根据您的需要对其进行改进。在中间打印内容,这样您就可以看到正则表达式匹配和不匹配的内容。

希望这能有所帮助:-)。

PS -我没有太多的运气尝试我的正则表达式,从我的第一次更新来捕获所有的换行符…如果你这样做了,请告诉我。

票数 80
EN

Stack Overflow用户

发布于 2009-07-13 05:22:13

代码语言:javascript
复制
<content>(?:[^\n]*(\n+))+</content>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1117807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档