用空格替换特定分隔符之间除文本之外的所有内容

Replace everything except text between specific delimiters with whitespaces

我有以下文本文件(文件最多可能包含几百行):

<% some important text %> something <% important stuff %>
not important stuff <not important stuff>
<% some
       important text
%>

基本上我需要用空格替换“<% %>”分隔符之间的任何内容。一行中可能多次出现 <% text %>。此外,<% %> 块可能分布在多行中,如上例所示。 结果应如下所示:

<% some important text %>           <% important stuff %>

<% some
       important text
%>

有什么处理方法的建议吗?尝试过正则表达式,很容易得到 <% text %> 但这还不够,我需要在模式不匹配的地方放置空格。 将不胜感激任何想法。

试试这个正则表达式:

(?s)(?<=%>).*?(?=<%)

它具有正向后视(-ahead),(?s) 打开单行选项(在您的正则表达式引擎中可能不同)。

用“<%”标记拆分整个文本。

在每个子字符串中搜索“%>”文字。

将该位置之后的所有内容替换为空格。

重新加入所有子字符串。

解决方案将使用 \G 元字符:

(%>\R*|\G\R*(?!<%)).

并替换为 (注意结尾的 space)

参见正则表达式 live demo here

正则表达式细分:

  • ( 捕获组 #1 开始
    • %>\R* 匹配 %> 和任何可选的尾随换行符
    • |
    • \G\R*(?!<%) 匹配主题字符串的开头或上一个匹配结束的地方,然后是任何可选的尾随换行符,前面没有 <%
  • ) 捕获组 #1 结束
  • . 匹配单个字符(换行符除外)

Java代码:

s = s.replaceAll("(%>\R*|\G\R*(?!<%)).", " ");

参见 live demo here

免责声明

这假设,

  1. 您没有嵌套块

  2. <%%> 分隔符正确配对

  3. <%%> 永远不会在块外发生