2014-10-29 299 views
2

我有要求从已编号的段落移除缩进。我目前使用一些正则表达式和一些代码来做到这一点,但是想用一个或多个正则表达式来完成它。该段看起来像这样:去除缩进的正则表达式

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}) 

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

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

回答

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) 

的想法是具有外正则表达式隔离第一行的缩进,而内部的正则表达式需要从随后的行中去除正确量的护理。

为了使这个工作,缩进必须完全由空格(即没有选项卡),否则你将不得不做一些制定标签的空间的假设。

这就是说你可能会更好地实施自定义分析器来完成这项工作。它肯定会更清洁,可能也更高效。

0

我不确定你是怎么想的,但是你的正则表达式匹配太阳下的所有东西,因为| |的右边。

试试这个:

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

使用类似http://www.regexr.com/对它进行测试。

+0

表达式的右侧|匹配从行首开始的0到9个空格。我想你也许没有看到这个空间?您的表达式会删除每行之前的所有空格,但不会保留第三行的缩进。尽管感谢您的帮助。 – user3565980 2015-01-19 20:36:52

+0

我刚刚意识到我的解决方案使用'9'的字面值并不是我的意图 - 应该是'4'。为了清晰我纠正了这一点。 – user3565980 2015-01-19 20:41:37

+0

啊哈,我看到了麻烦 - 当我们在一个非编号的线上遇到一场比赛时,我们不知道要移除多少空间(基于较早的比赛)。我不明白只有正则表达式才有可能。 – 2015-01-19 20:43:10