正则表达式用于删除缩进

时间:2014-10-29 16:46:36

标签: regex

我要求从编号的段落中删除缩进。我目前使用一些正则表达式和一些代码执行此操作,但希望使用一个或多个正则表达式来完成它。该段看起来像这样:

 1.  THE FIRST LINE OF THE PARAGRAPH
     ANOTHER LINE IN THE PARAGRAPH
         AN INDENTED LINE WITHIN THE PARAGRAPH

这需要进行转换以保留段落中的缩进,但删除整个段落的缩进,如第一行的缩进所测量。

THE FIRST LINE OF THE PARAGRAPH
ANOTHER LINE IN THE PARAGRAPH
    AN INDENTED LINE WITHIN THE PARAGRAPH

以下正则表达式通过用空字符串替换匹配来完成任务。 (请注意,此内容中没有预期的标签,只有空格):

(\A *\d+\. *|^ {0,5})

但它要求明确设置 5 字符的缩进长度。我希望这样做的通用方法适用于任何缩进长度。关于一个或多个正则表达式(累积应用)如何实现这一点的任何想法?

我正在使用启用了多行模式的.NET正则表达式引擎。

2 个答案:

答案 0 :(得分:1)

我不确定你认为它会如何起作用,但你的正则表达式会匹配阳光下的所有东西,因为它的右侧。|

试试这个:

^((?:\d+\.)? +)

使用类似http://www.regexr.com/的内容来测试它。

答案 1 :(得分:1)

正如其他人所指出的那样,正则表达式(单独)可能不是正确的工具。

主要问题是,为了从所有其他行中去除正确数量的空格,您需要以某种方式存储第一个缩进的宽度。这是我不确定单独使用正则表达式引擎的原因。

如果你对基于正则表达式的方法的渴望只是为了快速一行,我认为你可以破解以下内容(我不熟悉.NET,所以我只会为你提供一个python解决方案):

re.sub(r"^([\d\. ]+)(.*)$", 
  lambda m: re.sub("^" + " "*len(m.group(1)), 
                   "", 
                   m.group(2), 
                   flags=re.MULTILINE), 
  paragraph, 
  flags=re.MULTILINE|re.DOTALL)

这个想法是让外部正则表达式隔离第一行的缩进,而内部正则表达式负责从后续行中删除正确的数量。

为了使其工作,缩进必须仅由空格(即没有制表符)制成,否则你将不得不对制作制表符的空格数做一些假设。

那说你可能最好实现一个自定义解析器来完成这项工作。它肯定会更清洁,也可能更有效率。