Порядок регулярных выражений при сопоставлении одной квадратной скобки - PullRequest
0 голосов
/ 27 апреля 2018

Привет всем вам,

У меня есть вопрос относительно конкретного регулярного выражения в Elisp и, в частности, в Elisp. Я пытаюсь сопоставить одну квадратную скобку, и у ielm есть это:

  (string-match "[\]\[]" "[")  ; ===> 0
  (string-match "[\[\]]" "[")  ; ===> nil

  (string-match "[\]\[]" "]")  ; ===> 0
  (string-match "[\[\]]" "]")  ; ===> nil

  (string-match "[\[\]]" "[]") ; ===> 0
  (string-match "[\]\[]" "[]") ; ===> 0
  (string-match "[\]\[]" "][") ; ===> 0
  (string-match "[\]\[]" "][") ; ===> 0

Где, как и в случае с JS, все они возвращают true:

'['.match(/[\[\]]/) // ===>['[']
'['.match(/[\]\[]/) // ===>['[']


']'.match(/[\[\]]/) // ===>[']']
']'.match(/[\]\[]/) // ===>[']']

'[]'.match(/[\[\]]/) // ===>['[']
'[]'.match(/[\]\[]/) // ===>['[']
']['.match(/[\[\]]/) // ===>[']']
']['.match(/[\]\[]/) // ===>[']']

Вот регулярное выражение101: https://regex101.com/r/e8sLXr/1

Я не понимаю, почему порядок моих квадратных скобок в Elisp имеет значение. Я пытался использовать двойную обратную косую черту, но это не помогает. На самом деле, это дает мне больше нулей в этих регулярных выражениях, тогда как я думал, что правильный способ избежать обратной слабости в строке для обработки регулярным выражением - это удвоить его: https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Example.html#Regexp-Example

Кто-нибудь знает, что мне не хватает, может мне помочь?

Приветствия

Thomas

РЕДАКТИРОВАТЬ: грамматика

1 Ответ

0 голосов
/ 27 апреля 2018

Во-первых, давайте отбросим обратную косую черту. [ и ] не являются специальными для строк (*), и, следовательно, экранирование их не меняет их. Таким образом, следующее эквивалентно и легче для чтения:

(string-match "[][]" "[")  ; ===> 0
(string-match "[][]" "]")  ; ===> 0
(string-match "[][]" "[]") ; ===> 0
(string-match "[][]" "][") ; ===> 0
(string-match "[][]" "][") ; ===> 0

Этот шаблон соответствует либо ], либо [, и все тестируемые строки имеют один из этих символов в начале; следовательно, мы совпадаем в позиции 0 в каждом случае.

Критически, чтобы включить ] в альтернативу символа, должен быть первым символом. Следовательно следующее не делает то, что вы хотели:

(string-match "[[]]" "[")  ; ===> nil
(string-match "[[]]" "]")  ; ===> nil
(string-match "[[]]" "[]") ; ===> 0

Этот шаблон в точности совпадает с [], поскольку [[] - это символьная альтернатива, соответствующая чему-либо в наборе, состоящем из одного символа [; и за этой символьной альтернативой следует ] (которая, когда не заканчивает символьную альтернативу, просто совпадает с собой).

Вы можете прочитать подробности "альтернативы персонажу" по адресу:

C-h i g (elisp)Regexp Special RET

<Ч />

(*) Обратите внимание, что обратные слэши не являются специальными для регулярного выражения, когда они в пределах альтернативы символа.

У ваших регулярных выражений не было обратной косой черты - потому что в строковом формате с двойными кавычками вам нужно было бы удвоить обратную косую черту, чтобы включить их в регулярное выражение - но если бы вы это сделали, и если бы они были также внутри альтернативы символа, это будет означать, что обратный слеш будет одним из символов, соответствующих этому набору.

например. "[\\]\\[]" - это регулярное выражение [\]\[], которое соответствует \[]

(Помните, что ] не может появиться в альтернативе символа, если это не первый символ.)

...