Сопоставление символов без пробелов в Perl 6

#regex #raku

#регулярное выражение #raku

Вопрос:

В Perl 6 вы можете использовать <.ws> для сопоставления символов, не содержащих пробелов. Я хочу сопоставить любой символ, который не совпадает <.ws> , но я не думаю, что смогу использовать S вместо этого, потому что я считаю, что это соответствует только пробелам ASCII, в то время как <.ws> будет соответствовать любому пробелу в Юникоде. Как мне это сделать?

Ответ №1:

Использование <.ws> — это вызов ws токена, который не фиксирует его результат. Его поведение по умолчанию:

 token ws { <!ww> s* }
  

Что означает, что:

  1. Мы не должны находиться между двумя символами word ( w )
  2. Предполагая, что это верно, на данный момент имеется ноль или более символов пробела

В данной грамматике это может быть переопределено для указания «пробела» текущего языка. Например, грамматика языка 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 , что вы ищете.