Подтвердить что ты не робот

Что делает класс персонажа только с одинокой кареткой?

При попытке ответить на вопрос Написание текста в новую строку при обнаружении определенного символа, я использовал Regexp::Grammars. Меня это давно заинтересовало, и, наконец, у меня были причины учиться. Я заметил, что в разделе описания у автора есть парсер LaTeX (я - жадный пользователь LaTeX, поэтому это меня заинтересовало), но здесь есть одна нечетная конструкция:

    <rule: Option>     [^][\$&%#_{}~^\s,]+

    <rule: Literal>    [^][\$&%#_{}~^\s]+

Что выполняют классы символов [^]?

4b9b3361

Ответ 1

[^][…] - это не два символьных класса, а только один класс символов, содержащий любой другой символ, кроме ], [ и (см. Специальные символы внутри скобочного символьного класса):

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

Примеры:

"+"   =~ /[+?*]/     #  Match, "+" in a character class is not special.
"\cH" =~ /[\b]/      #  Match, \b inside in a character class
                     #  is equivalent to a backspace.
"]"   =~ /[][]/      #  Match, as the character class contains.
                     #  both [ and ].
"[]"  =~ /[[]]/      #  Match, the pattern contains a character class
                     #  containing just ], and the character class is
                     #  followed by a ].