在Emacs的正則表達式中,爲什麼^[^[:digit:]]
與數字前的數字和換行符匹配。它會匹配整個第二行和第三行爲什麼`^ [^ [:digit:]]`匹配數字前的數字和換行符
1
1
但不是第一行。
我最初的想法是使用^[^[:digit:]]
來匹配不以數字開頭的行。爲什麼這不適合我的目的?什麼正則表達式可以用於我的目的?
謝謝。
在Emacs的正則表達式中,爲什麼^[^[:digit:]]
與數字前的數字和換行符匹配。它會匹配整個第二行和第三行爲什麼`^ [^ [:digit:]]`匹配數字前的數字和換行符
1
1
但不是第一行。
我最初的想法是使用^[^[:digit:]]
來匹配不以數字開頭的行。爲什麼這不適合我的目的?什麼正則表達式可以用於我的目的?
謝謝。
按照documentation看來,你不能在一個字符類使用[:digit:]
:
支架表達式用於匹配字符的範圍。範圍向後的括號表達式,例如'[z-a]',將被忽略。在方括號內,字面意思是「\」。字符類不受支持,所以例如您需要使用'[0-9]'而不是'[[:digit:]]'。
這就解釋了爲什麼你不能使用你的正則表達式,因爲你試圖否定字符類中的[:digit:]
。
我不知道爲什麼不工作,但你可以通過執行實現相同的:
^[^0-9]
您提到的文檔已過時,現代Emacs版本支持字符類,如'[:digit:]'。 – Lindydancer
@Lindydancer感謝您的評論,但在我的回答中,我提到了Emacs支持括號表達式的引用,但它不支持字符類中的括號表達式,所以'[:digit:]''while'[[:digit:] ]'不是 –
我讀它的方式恰恰相反。 Emacs僅在括號表達式中支持字符類**,所以'[[:digit:]]'匹配一個數字,而'[:digit:]'不匹配。請參閱http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#Regexp-特別 - 「字符替代」下的最後一節描述了這一點。 – Lindydancer
隨着反向標誌[^some-character]
也換行符匹配。在這個例子中,二線的「\ n」是匹配的,沒有別的。
這個電話在緩衝區的開頭:
(progn (re-search-forward "^[^[:digit:]]" nil t 1)
(message "%s" (match-string-no-properties 0)))
你的正則表達式的數字在所有不匹配,則只匹配換行符。它匹配它的原因是因爲換行符不是數字。
您可以通過在數字之間的空行上評估以下內容來驗證此情況。它將模式點到比賽結束,即前的數字:
(when (looking-at "^[^[:digit:]]") (goto-char (match-end 0)))
那麼你會喜歡做的事吧。在某種程度上,您的正則表達式適合您,因爲它匹配空行,並且它們不以數字開頭。但是,如果您想排除空行,則可以使用以下"^[^[:digit:]\n]"
。這也將排除以換行符開始的行,即空行。
奇怪;它適用於grep。 – jangler