在查找/替换中使用正则表达式替换多个匹配项

时间:2014-10-16 04:20:12

标签: regex sublimetext

我正在使用Sublime Text,我想使用“查找/替换”将HTML格式化为Markdown。我遇到的一个问题是如何替换多个匹配项?

HTML如下:

<blockquote>
    <p> text 1 </p>
    <p> text 2 </p>
    <p> text 3 </p>
    <p> text 4 </p>
</blockquote>

我想将其改为

><p> text 1 </p>
><p> text 2 </p>
><p> text 3 </p>
><p> text 4 </p>

我用

<blockquote>\n(^.+$\n)+?.+</blockquote>

捕获 blockquote 中的 p 标记。但是如何取代呢?

非常感谢。

2 个答案:

答案 0 :(得分:2)

我已经针对您的简单测试用例进行了测试。主要问题是,它可能适用于更复杂的输入,也可能不适用,您可能需要进一步自定义正则表达式。

找到:

(?:<blockquote>\s*+|(?<!\A)(?<!</blockquote>)\G)(.*)\s++(?:</blockquote>)?

此解决方案将清除结束标记,因为它与最后一行匹配。它修复了第一个解决方案中的警告,其中未删除结束标记</blockquote>

替换为:

\n> $1

使用正则表达式模式并突出显示匹配项以检查要替换的内容。

它将删除所有前导空格,并在>和文本之间只留一个空格。

上面的正则表达式是基于我自己对单独用正则表达式解决这类问题的答案构建的:Collapse and Capture a Repeating Pattern in a Single Regex Expression

我之前的解决方案基于第二个构造,而当前的解决方案基于第一个构造。这里引用了初始解决方案,以防您想要使用其结束标记(例如自由间距)自定义正则表达式更灵活:

(?:<blockquote>\s*+|(?!\A)\G\s++(?!</blockquote>))(.*)

答案 1 :(得分:0)

您可以分两步完成此操作。

1)<blockquote>((?:(?!<\/blockquote>).)*)<\/blockquote>替换为$1

参见演示。

http://regex101.com/r/dZ1vT6/35

2)^\s+替换为<

参见演示。

http://regex101.com/r/dZ1vT6/36