2014-10-29 104 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