2015-06-17 70 views
0

在Emacs的正則​​表達式中,爲什麼^[^[:digit:]]與數字前的數字和換行符匹配。它會匹配整個第二行和第三行爲什麼`^ [^ [:digit:]]`匹配數字前的數字和換行符

1 

1 

但不是第一行。

我最初的想法是使用^[^[:digit:]]來匹配不以數字開頭的行。爲什麼這不適合我的目的?什麼正則表達式可以用於我的目的?

謝謝。

+0

奇怪;它適用於grep。 – jangler

回答

1

按照documentation看來,你不能在一個字符類使用[:digit:]

支架表達式用於匹配字符的範圍。範圍向後的括號表達式,例如'[z-a]',將被忽略。在方括號內,字面意思是「\」。字符類不受支持,所以例如您需要使用'[0-9]'而不是'[[:digit:]]'。

這就解釋了爲什麼你不能使用你的正則表達式,因爲你試圖否定字符類中的[:digit:]

我不知道爲什麼不工作,但你可以通過執行實現相同的:

^[^0-9] 
+0

您提到的文檔已過時,現代Emacs版本支持字符類,如'[:digit:]'。 – Lindydancer

+0

@Lindydancer感謝您的評論,但在我的回答中,我提到了Emacs支持括號表達式的引用,但它不支持字符類中的括號表達式,所以'[:digit:]''while'[[:digit:] ]'不是 –

+0

我讀它的方式恰恰相反。 Emacs僅在括號表達式中支持字符類**,所以'[[:digit:]]'匹配一個數字,而'[:digit:]'不匹配。請參閱http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#Regexp-特別 - 「字符替代」下的最後一節描述了這一點。 – Lindydancer

1

隨着反向標誌[^some-character]也換行符匹配。在這個例子中,二線的「\ n」是匹配的,沒有別的。

這個電話在緩衝區的開頭:

(progn (re-search-forward "^[^[:digit:]]" nil t 1) 
     (message "%s" (match-string-no-properties 0))) 
1

你的正則表達式的數字在所有不匹配,則只匹配換行符。它匹配它的原因是因爲換行符不是數字。

您可以通過在數字之間的空行上評估以下內容來驗證此情況。它將模式點到比賽結束,即前的數字:

(when (looking-at "^[^[:digit:]]") (goto-char (match-end 0))) 

那麼你會喜歡做的事吧。在某種程度上,您的正則表達式適合您,因爲它匹配空行,並且它們不以數字開頭。但是,如果您想排除空行,​​則可以使用以下"^[^[:digit:]\n]"。這也將排除以換行符開始的行,即空行。