【问题标题】:Replace everything except text between specific delimiters with whitespaces用空格替换除特定分隔符之间的文本以外的所有内容
【发布时间】:2019-03-23 19:28:39
【问题描述】:

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

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

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

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

<% some
       important text
%>

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

【问题讨论】:

  • 标签可以嵌套吗?是否可以转义打开或关闭令牌?例如,some important text 是否可以包含字符串:"%&gt;" 或 \\%&gt; 或类似的东西?
  • 标签不能嵌套,标签之间的文字不能有任何形式的“”(标签外的文字也是如此)
  • 您是想用空格替换每个块外字符还是用一个空格替换所有字符?
  • 我需要将每个块外字符替换为空格,即“某事”必须替换为 9 个空格。
  • 请看下面我的回答。

标签: java regex regex-negation text-processing


【解决方案1】:

一个解决方案是使用\G 元字符:

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

并替换为$1 (注意尾随空格)

见正则表达式live demo here

正则表达式分解:

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

Java 代码:

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

见live demo here

免责声明

这假设,

  1. 您没有嵌套块

  2. &lt;% 和 %&gt; 分隔符正确配对

  3. &lt;% 和 %&gt; 永远不会出现在区块之外

【讨论】:

  • 不适用于第一个重要块之前的不重要(多行)文本。
  • 你的确切意思是什么?
  • 抱歉,我指的是&lt;% xxx %&gt; 是一段重要的文字。
  • 你看过现场演示吗?
  • 该演示在重要文本的第一块之前没有不重要的文本,如果有,不重要的文本不会被空白。 "a&lt;%b%&gt;c&lt;%d%&gt;e" 变为 "a&lt;%b%&gt; &lt;%d%&gt; ",a 也应该被空格替换。
【解决方案2】:

用“

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

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

重新加入所有子字符串。

【讨论】:

  • 他正在寻找正则表达式解决方案的时间更长
  • @faris - OP 没有规定需要正则表达式,只是尝试没有成功。这确实是获得解决方案的一种可行方法,如果处理得当,无疑会奏效。
【解决方案3】:

试试这个正则表达式:

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

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

【讨论】:

  • 然后用那个正则表达式做什么?
  • @Andreas,显然用空字符串替换这个正则表达式的所有匹配项:D
  • 但是 OP 不想用空格替换文本,而不是空字符串。这是问题难度的很大一部分,这个答案没有涵盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2020-10-30
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多