#regex #raku
#регулярное выражение #raku
Вопрос:
В Perl 6 вы можете использовать <.ws>
для сопоставления символов, не содержащих пробелов. Я хочу сопоставить любой символ, который не совпадает <.ws>
, но я не думаю, что смогу использовать S
вместо этого, потому что я считаю, что это соответствует только пробелам ASCII, в то время как <.ws>
будет соответствовать любому пробелу в Юникоде. Как мне это сделать?
Ответ №1:
Использование <.ws>
— это вызов ws
токена, который не фиксирует его результат. Его поведение по умолчанию:
token ws { <!ww> s* }
Что означает, что:
- Мы не должны находиться между двумя символами word (
w
) - Предполагая, что это верно, на данный момент имеется ноль или более символов пробела
В данной грамматике это может быть переопределено для указания «пробела» текущего языка. Например, грамматика языка Perl 6 ws
включает в себя синтаксический анализ комментариев, Pod и даже heredocs!
В отличие от этого, s
это класс символов для сопоставления с одним символом пробела и S
означает «не символ пробела». Это определение основано на Unicode; если мы сделаем:
say .uniname for (0..0x10FFFF).map(*.chr).grep(/s/)
Тогда мы получаем:
<control-0009>
<control-000A>
<control-000B>
<control-000C>
<control-000D>
SPACE
<control-0085>
NO-BREAK SPACE
OGHAM SPACE MARK
EN SPACE
EM SPACE
EN SPACE
EM SPACE
THREE-PER-EM SPACE
FOUR-PER-EM SPACE
SIX-PER-EM SPACE
FIGURE SPACE
PUNCTUATION SPACE
THIN SPACE
HAIR SPACE
LINE SEPARATOR
PARAGRAPH SEPARATOR
NARROW NO-BREAK SPACE
MEDIUM MATHEMATICAL SPACE
IDEOGRAPHIC SPACE
Следовательно, наиболее вероятно S
, что вы ищете.