【问题标题】:Regex: Skip/Ignore pattern正则表达式:跳过/忽略模式
【发布时间】:2010-04-23 13:56:29
【问题描述】:

鉴于以下字符串嵌入在文本中,如何提取整行但不匹配内部“”?

<test type="yippie<innertext>" />

编辑
更具体地说,我们需要处理以下两个用例,其中“type”有或没有“”字符。

<h:test type="yippie<innertext>" />
<h:test type="yippie">

Group 1: 'h:test'
Group 2: ' type="yippie<innertext>" '  -or-  ' type="yippie"'   (ie, remaining content before ">" or "/>")

到目前为止,我有这样的东西,但它与第 2 组在第一个“>”处停止的方式有点不同。调整第 2 组条件的第一部分。

(<([a-zA-Z0-9_:-]+)([^>"]*|[^>]*?)\s*(/)?>)

感谢您的帮助。

【问题讨论】:

    标签: regex


    【解决方案1】:

    试试这个:

    <([:\w]+)(\s(?:"[^"]*"|[^/>"])+)/?>
    

    示例用法(Python):

    >>> x = '<h:test type="yippie<innertext>" />'
    >>> re.search('<([:\w]+)(\s(?:"[^"]*"|[^/>"])+)/?>', x).groups()
    ('h:test', ' type="yippie<innertext>" ')
    

    另外请注意,如果您的文档是 HTML 或 XML,那么您应该使用 HTML 或 XML 解析器,而不是尝试使用正则表达式来执行此操作。

    【讨论】:

    • 是的,你在上面。我应该更清楚更完整。我需要对匹配的标签名称和剩余批次进行分组。见上文。
    【解决方案2】:

    您似乎正在尝试使用正则表达式解析 XML/HTML。我会说你的方法从根本上是错误的。足够高级的正则表达式与 XML 解析器没有区别。毕竟,如果你需要解析怎么办:

    <test type="yippie<inner\"text\"_with_quotes,_literal_slash_and_quote\\\">" />
    

    此外,您可能需要将内部 &amp;lt;&amp;gt; 转义为 &amp;lt;&amp;gt;

    关于你不应该用正则表达式解析 XML 的更多原因,我只能屈服于这个优越的答案:

    RegEx match open tags except XHTML self-contained tags

    【讨论】:

    • 我希望可以。现有的实现迫使我动手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2021-09-13
    • 2020-08-06
    相关资源
    最近更新 更多