匹配Perl 6中的非空白字符

问题描述 投票:8回答:1

在Perl 6中,您可以使用<.ws>来匹配非空白字符。我想匹配任何与<.ws>不匹配的字符,但我不认为我可以使用\S,因为我相信只匹配ASCII空格,而<.ws>将匹配任何Unicode空间。我该怎么做呢?

regex perl6 raku
1个回答
10
投票

<.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是你正在寻找的。

© www.soinside.com 2019 - 2024. All rights reserved.