【问题标题】:Regular Expressions and Inline XML正则表达式和内联 XML
【发布时间】:2012-03-12 14:18:16
【问题描述】:

我有一个内联 XML 文件(xml 标签 + 文本)。 我想在特定标签之前抓取 4 个单词。 例如:

案例一:

I used to live in <Location>London</Location>.

案例 2:

I work for <Organization> Microsoft Tech.</Organization>
which is in <Location>London</Location>

在这两种情况下,我都想在位置标签前抓取 4 个单词。

输出:

案例一:

used to live in

案例 2:

</Organizattion> which is in

这可能吗?谁能帮帮我?

【问题讨论】:

  • @winSharp93 OP 的特殊问题很简单,可以通过正则表达式解决。令人惊讶的是,有多少人反刍你不能在不了解原因的情况下将正则表达式应用于 xml。

标签: xml regex xml-parsing inline-xml


【解决方案1】:

嗯,最简单的应该是:

((?:\S+\s+){4}\s*)<Location>

请注意,这不会在您的第二种情况下产生所需的结果,因为它假定非空白运行由空白分隔,因此它会在那里产生Tech.&lt;/Organization&gt; which is in

【讨论】:

  • 我已经有一个正则表达式来处理第一种情况。我正在寻找一个在第二种情况下也可以抓取的正则表达式。 :( 无论如何感谢您的努力!
【解决方案2】:

虽然这很疯狂,我不建议使用它,但您可以使用 awk 执行类似的操作:

awk '/<Location>/ {n=gensub("(.*)<Location>.*","\\1","g",$0); print gensub(".*[ .]([^ .]+ [^ .]+ [^ .]+ [^ .]+) *$","\\1","g",n)} ' INPUTFILE

您可能需要修改 [^ .] 部分以正确确定单词的一部分。

  1. 这在&lt;Location&gt; 的行上运行
  2. 将部分行保存到&lt;Location&gt;
  3. 打印它找到的四个单词。 (注意如果没有匹配,它将打印之前保存的行部分。)

【讨论】:

    【解决方案3】:

    您需要的正则表达式必须基于正面的外观。对于您的 2 个案例,以下作品:

    /(?:[<>\/\w]+\s*){4}(?=<Location>)/s
    

    如果您需要使用上述正则表达式的演示,请告诉我。

    【讨论】:

    • 我在这里试过你的表达方式:myregextester.com/index.php 但是我没有得到所需的输出。您能否提供更多信息.. 非常感谢!
    • 我也在同一页面上尝试过,它在那里也运行良好。确保你在没有/ 的情况下输入正则表达式。所以在MATCH PATTERN 中输入(?:[&lt;&gt;\/\w]+\s*){4}(?=&lt;Location&gt;) 并检查标志s(它是一个复选框)。然后输入以上2个文本中的任何一个,然后单击提交。
    猜你喜欢
    • 2020-01-12
    • 2014-05-28
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多