Соответствие непробельным символам в Perl 6 - PullRequest
8 голосов
/ 08 апреля 2019

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

1 Ответ

10 голосов
/ 08 апреля 2019

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

token ws { <!ww> \s* }

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

  1. Мы не должны быть между двумя словами (\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 - это то, что вы ищете.

...