Regex 正则表达式以匹配a<;中的每一个新行字符(\n)<;内容>;标签

Regex 正则表达式以匹配a<;中的每一个新行字符(\n)<;内容>;标签,regex,Regex,我正在寻找一个正则表达式来匹配XML标记中的每一个新行字符(\n),或该标记中的任何标记,例如: <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 h

我正在寻找一个正则表达式来匹配
XML标记中的每一个新行字符(
\n
),或该
标记中的任何标记,例如:

<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>

(此处不匹配新行)
(此处是否匹配新行)

(此处是否匹配新行)

(此处不匹配新行) (此处是否匹配新行)
(?:[^\n]*(\n+)+

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

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

您可以采取两种方法:

  • 首先去掉所有评论。然后使用regex方法
  • 不要使用正则表达式,使用上下文敏感的解析方法,可以跟踪您是否嵌套在注释中
  • 小心点

    我也不太确定你能一次匹配所有的新线@石英建议这样做:

    <content>([^\n]*\n+)+</content>
    
    ([^\n]*\n+)+
    
    这将匹配任何在结束标记前有换行符的内容标记。。。但我不确定你所说的匹配所有新词是什么意思。是否希望能够访问所有匹配的换行符?如果是这样,最好抓取所有内容标签,然后搜索嵌套在它们之间的所有换行符。更像这样:

    <content>.*</content>
    
    *
    
    但是有一个警告:正则表达式是贪婪的,所以这个正则表达式将匹配第一个开始标记和最后一个结束标记。相反,您必须抑制正则表达式,这样它就不会贪婪。在python之类的语言中,可以使用“?”正则表达式符号来实现这一点

    我希望通过这篇文章,你能看到一些陷阱,并找出你想要如何继续下去。您最好使用XML解析库,然后迭代所有内容标记

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

    更新1:

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

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

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

    此外,您还可以尝试使用match objects Group()访问每个换行符:

    (.*?(\n))+.*?
    
    我知道我的逃跑已经结束了,但它抓住了这个想法。最后一个例子可能不起作用,但我认为这是表达你想要的东西的最佳选择。我的建议仍然是:要么抓取所有的内容标签,自己动手,要么使用解析库

    更新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)
    
    #/usr/bin/python
    进口稀土
    def FindContentNewlines(xml_文本):
    #我可能想在其他地方编译这些正则表达式,但我在这里这样做是为了简洁
    注释=re.compile(r“”,re.DOTALL)
    content=re.compile(r“(.*?”),re.DOTALL)
    换行符=re.compile(r“^(.*?$”,re.MULTILINE | re.DOTALL)
    #条注释:对于“嵌套注释”,这实际上可能不可靠
    #xml如何处理-->。我不确定。但那是可能的
    #有麻烦了。
    xml_text=re.sub(注释,“,xml_text)
    结果=[]
    all_contents=re.findall(内容,xml_文本)
    对于所有内容中的c:
    扩展结果(关于findall(换行符,c))
    返回结果
    如果名称=“\uuuuu main\uuuuuuuu”:
    示例=”“”
    这东西很好
    
    哈哈!
    

    这是找不到的 """ 打印FindContentNewlines(示例)
    此程序打印结果:

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

    ,']
    第一个和最后一个空字符串来自紧跟在第一个
    之前的换行符,以及紧跟在
    之后的换行符。总的来说,这(在很大程度上)起到了作用。尝试此代码并根据您的需要对其进行优化。打印出中间的东西,这样你就可以看到正则表达式的匹配和不匹配。

    希望这有帮助:-)


    PS-我没有太多的运气尝试我的正则表达式从我的第一次更新捕获所有的新行。。。如果需要,请告诉我。

    您想只匹配新行还是按照Quartz的答案匹配所有文本?是的,它应该是正则表达式,并且应该只匹配新行。您使用的是哪种正则表达式风格?PHP、.NET、Java?Moayad,不,它不应该是正则表达式,因为正则表达式在数学上无法可靠地执行任务。让量词不贪婪怎么样?([^\n]*?\n+?)+?@Codebender,您的代码匹配标记内的所有内容,我只想匹配新行。Quarz,谢谢,但这不是我要找的,您的正则表达式匹配第一个开始标记和最后一个结束标记之间的每个字符。我已经更新了示例,使其更清晰。我修复了正则表达式,以便组1与换行符匹配。但不幸的是,大多数正则表达式似乎只能连续分组。您最好逐行应用正则表达式。以下是我在编写上述代码时针对python查看的正则表达式文档(如果您不熟悉python中的正则表达式,这将非常有用):@Moayad:btw,如果存在嵌套标记,此方法肯定不起作用。。。没有任何正则表达式能够处理这个问题。正则表达式确实不适合这个问题。非常感谢您的详细解释:)它肯定会帮助我决定如何处理这个问题。再次感谢!
    #!/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>', '']