关于perl \ w的含义

时间:2017-11-18 01:05:28

标签: regex perl

根据文件

  

\ w [3]匹配"字"字符(字母数字加" _",加号   其他连接符标点符号加上Unicode标记)

我不明白什么是"以及其他连接符标点字符加上Unicode标记",文档似乎没有说。什么是\w真的?

2 个答案:

答案 0 :(得分:5)

Unicode 9.0.0中包含119,821个匹配字符(包含在Perl 5.26.0中):

$ unichars -a -u '\w' | wc -l
119821

您可以使用unichars列出与属性匹配的字符,您可以使用uniprops列出与字符匹配的属性。两者均由Unicode::Tussle提供。

perluniprops个文档\p\w\p{XPosixWord} [1] 的缩写,所以这是一个应该查阅的文档了解有关\w和其他属性的更多信息。

最新的perluniprops [2] 文件表明\w包含以下属性的并集:

  • XPosixWord
    • XPosixAlnum:字母和小数位数。
      • Alphabetic
      • Decimal_Number:十进制数字。
    • Mark
    • Connector_Punctuation
    • Join_Control

验证

$ diff -u \
   <( unichars -a -u '\w' ) \
   <( unichars -a -u '[\p{Alphabetic}\p{Decimal_Number}\p{Mark}\p{Connector_Punctuation}\p{Join_Control}]' ) \
      && echo "No difference."
No difference.

详细说明:

  • 自定义派生属性XPosixWord
    • 自定义派生属性XPosixAlnum:字母和小数位数。
      • 派生属性Alphabetic
        • 派生属性Uppercase
          • 常规类别Uppercase_LetterLu
          • Other_Uppercase [3]
        • 派生属性Lowercase
          • 常规类别Lowercase_LetterLl
          • Other_Lowercase [3]
        • 常规类别Titlecase_LetterLt
        • 常规类别Modifier_LetterLm
        • 常规类别Other_LetterLo
        • 常规类别Letter_NumberNl
        • Other_Alphabetic [3]
      • 常规类别Decimal_NumberNd):十进制数字。
    • 常规类别MarkM):
      • 常规类别Spacing_MarkMc
      • 常规类别Enclosing_MarkMe
      • 常规类别Nonspacing_MarkMn
    • 常规类别Connector_PunctuationPc
    • Join_Control
  1. 使用/uuse feature qw( unicode_strings );
  2. 5.28将是第一个正确记录XPosixWord的版本(因为在5.18中添加了Join_Control个字符)。
  3. Perl未曝光。

答案 1 :(得分:3)

您的引用来自perldoc perlre。相应的脚注说:

  

其中说:

  

\w匹配单个字母数字字符(字母字符或十进制数字);或连接标点字符,例如下划线(“_”);或者是一个附加在其中一个上面的“标记”字符(如某种口音)。它与整个单词不匹配。要匹配整个单词,请使用\w+。这与匹配英文单词不同,但在ASCII范围内,它与Perl标识符字符串相同。

它还说(如果Unicode规则生效),\w相当于\p{Word}perldoc perluniprops

\p{Word}                \p{XPosixWord}

即。 \p{Word}\p{XPosixWord}的别名。

\p{XPosixWord}          \w, including beyond ASCII; = \p{Alnum} + \pM + \p{Pc} (Short: \p{Word})

即。 \p{XPosixWord}\p{Alnum}\pM\p{Pc}的联合。

此处\p{Alnum}匹配任何“字母和(十进制)数字”字符,\pM匹配任何一般类别为“Mark”的字符,\p{Pc}匹配任何一般类别为“连接器标点符号”的字符。

对于这些类别中的完整字符列表,我将不得不遵循Unicode。