【问题标题】:multi-line xml regex in sublimesublime 中的多行 xml 正则表达式
【发布时间】:2013-08-01 12:38:11
【问题描述】:

我有一个很大的 XML 日志文件(+100 000 行),如下所示:

<container>
   <request:getApples xml="...">
     ...
   </request:getApples>
   <request:getOranges xml="...">
     ...
   </request:getOranges>
</container>
...

我想将:getXXXX部分提取到

getApples
getOranges

通过在 Sublime Text 2 中进行正则表达式查找和替换。

类似

Find:      [^(request:)]*(.*) xml
Replace:   $1\n

任何正则表达式大师可以提供帮助?

【问题讨论】:

    标签: regex sublimetext2


    【解决方案1】:

    纠正 mart1n 的 answer 并实际使用 ST2 和您的示例输入,我想出了以下内容:

    首先,CtrlA全选。然后,CtrlH

    Search: .*?(get\w+) .*
    Replace: $1
    

    全部替换

    那么,

    Search: ^[^get].*$
    Replace: nothing
    

    全部替换

    最后,

    Search: ^\n
    Replace: nothing
    

    全部替换

    剩下的就是:

    getApples
    getOranges
    

    【讨论】:

      【解决方案2】:

      不熟悉 Sublime Text,但您可以分两部分进行:

      • 找到.*?\(get\w+\) .* 并替换为\1。现在那些 get* 字符串在单独的行上,没有别的了。剩下的就是去除杂物。

      • 所以,有很多方法可以做到这一点。简单的一个:找到^[^g][^e][^t].*$ 并替换为空字符串(空字符串)。

      现在你的文件只包含你想要的字符串和一些空行,(我希望)Sublime 可以通过一些 delete-empty-lines 函数摆脱它们。

      您可以快速将以上所有内容放入一个宏中,并针对任何遵循相同格式的输入随意执行;-)

      【讨论】:

        【解决方案3】:

        如果您愿意从 sublime 文本中解决问题,您可以使用 dotall 标志和惰性匹配来仅提取 getXXX 部分。

        更换

        .*?(get\w*) .*?

        $1\n

        应该能帮到你,只在文件末尾留下一些我目前无法弄清楚的容易移除的结束标签。

        您可以查看此解决方案here

        也许有人可以接受这个并想办法删除多余的结束标签。

        【讨论】:

          【解决方案4】:

          试试这个

          查找内容::(\w+)&gt;|.\s?

          替换为:$1

          如果没有按预期工作,请告诉我?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-09-28
            • 2017-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-25
            相关资源
            最近更新 更多