用空格将特定定界符之间的文本以外的所有内容替换为

时间:2018-10-18 22:12:22

标签: java regex regex-negation text-processing

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

<% 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%>,但这还不够,我需要在模式不匹配的所有地方放置空格。 将不胜感激。

3 个答案:

答案 0 :(得分:0)

尝试此正则表达式:

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

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

答案 1 :(得分:0)

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

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

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

重新加入所有子串。

答案 2 :(得分:0)

一种解决方案可以使用>>> lst = ['[175', '178', '182', '172', '167', '164]', "['b']"] >>> ','.join(lst) "[175,178,182,172,167,164],['b']" >>> ast.literal_eval(','.join(lst)) ([175, 178, 182, 172, 167, 164], ['b']) >>> [x for sub in ast.literal_eval(','.join(lst)) for x in sub] [175, 178, 182, 172, 167, 164, 'b'] 元字符:

\G

并替换为(%>\R*|\G\R*(?!<%)). (注意尾随空格)

请参见正则表达式live demo here

正则表达式细目:

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

Java代码:

.

请参见live demo here

免责声明

这是假定

  1. 您没有嵌套块

  2. s = s.replaceAll("(%>\\R*|\\G\\R*(?!<%)).", "$1 "); <%分隔符已正确配对

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