2015-06-17 3 views
0

В регулярном выражении Emacs почему ^[^[:digit:]] соответствует цифре и новому символу линии перед цифрой, например. он будет соответствовать всей второй и третьей линиямПочему `^ [^ [: digit:]]` соответствует цифре и новому символу линии перед цифрой

1 

1 

но не первая строка.

Моя первоначальная мысль состоит в том, чтобы использовать ^[^[:digit:]] для соответствия строке, не начинающейся с цифры. Почему это не работает для моей цели? Какое регулярное выражение может работать для моей цели?

Спасибо.

+0

Weird; он работает с grep. – jangler

ответ

1

Согласно documentation, кажется, что вы не можете использовать [:digit:] в классе символов:

Кронштейна выражение используется для соответствия диапазонов символов. Выражения скобок, в которых диапазон находится назад, например '[z-a]', игнорируются. В квадратных скобках «\» берется буквально. Классы символов не поддерживаются, поэтому, например, вам нужно будет использовать «[0-9]» вместо «[[: digit:]]».

Это объясняет, почему вы не можете использовать регулярное выражение, поскольку вы пытаетесь отрицать [:digit:] в классе символов.

Я не знаю, почему это не работает, но вы можете достичь того же, выполнив:

^[^0-9] 
+0

Документация, о которой вы говорили, устарела, современные версии Emacs поддерживают классы символов, такие как '[: digit:]'. – Lindydancer

+0

@ Lindydancer спасибо за комментарий, но в моем ответе я поставил цитату, что Emacs поддерживает выражения скобок, но не поддерживает выражения в скобках внутри символьного класса, поэтому '[: digit:]' while '[[: digit:] ] 'is not –

+0

Как я его читал, все наоборот. Emacs поддерживает классы символов ** только ** в выражениях скобок, поэтому '[[: digit:]]' соответствует цифре, тогда как '[: digit:]' does not. См. Http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#Regexp-Special - описывает этот раздел в разделе «альтернативный символ». – 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]". Это также исключает строки, начинающиеся с символа новой строки, т. Е. Пустые строки.

Смежные вопросы