为什么`^ [^ [:digit:]]`匹配数字之前的数字和新行字符

时间:2015-06-17 02:09:49

标签: regex emacs

在Emacs的正则​​表达式中,为什么^[^[:digit:]]匹配数字前面的数字和新行字符,例如它将与

的第二行和第三行的整个匹配
1

1

但不是第一行。

我原来的想法是使用^[^[:digit:]]来匹配不以数字开头的行。为什么这不符合我的目的?什么正则表达式可以用于我的目的?

感谢。

3 个答案:

答案 0 :(得分:1)

根据 documentation ,您似乎无法在字符类中使用[:digit:]

  

括号表达式用于匹配字符范围。范围向后的括号表达式,例如'[z-a]',将被忽略。在方括号内,'\'字面意思。不支持字符类,例如,您需要使用'[0-9]'而不是'[[:digit:]]'。

这解释了为什么你不能使用你的正则表达式,因为你试图否定一个字符类中的[:digit:]

我不知道为什么这不起作用,但你可以通过这样做来实现同样的目标:

^[^0-9]

答案 1 :(得分:1)

使用反向符号[^some-character]也可以匹配换行符。在示例中,第二行的“\ n”匹配,没有别的。

在缓冲区的开头调用它:

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

答案 2 :(得分:1)

你的正则表达式根本不匹配数字,它只匹配换行符。它匹配它的原因是因为换行符不是数字。

您可以通过在数字之间的空行上评估以下内容来验证这一点。它会将点模式化为匹配结束,即之前数字:

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

那么你想做什么呢?在某种程度上,你的正则表达式适合你,因为它匹配空行,并且它们不以数字开头。但是,如果要排除空行,​​可以使用以下"^[^[:digit:]\n]"。这也将排除以换行符开头的行,即空行。