【问题标题】:Matching non-whitespace characters in Perl 6在 Perl 6 中匹配非空白字符
【发布时间】:2019-04-07 23:50:03
【问题描述】:

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

【问题讨论】:

    标签: regex raku


    【解决方案1】:

    <.ws> 的用法是对 ws 令牌的调用,但不会捕获其结果。它的默认行为是:

    token ws { <!ww> \s* }
    

    这意味着:

    1. 我们不能介于两个单词 (\w) 字符之间
    2. 假设这是真的,此时有零个或多个空白字符

    在给定的语法中,可以覆盖它以指定当前语言的“空白”。以 Perl 6 语言语法为例,ws 包括对 cme​​ts、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 很可能就是您正在寻找的。​​p>

    【讨论】: