2017-11-18 321 views
1

的含義根據該文檔關於perl的 W

\ W [3]匹配一個 「字」 的字符(字母數字加上 「_」,加 其他連接器標點字符加的Unicode引號)

我不明白什麼是「加上其他連接器標點符號加上Unicode標記」,該文檔似乎沒有說。什麼是\w真的?

回答

5

有以Unicode 9.0.0 119821個匹配字符(包括在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]
        • 派生p roperty 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_Punctuation類別(Pc
    • Join_Control

  1. 當使用/uuse feature qw(unicode_strings);
  2. 5.28將成爲第一個版本,正確地記錄XPosixWord(因爲在5.18中添加了Join_Control字符)。
  3. 未由Perl公開。
+0

嗨@ikegami。 「unichars」在哪裏?我無法使用apt進行安裝。然後我下載Unicode :: Tussle,有一個unichars腳本。但是'unichars -a -u'\ w''不起作用 – user15964

+0

該文檔已修復爲blead:https://perl5.git.perl.org/perl.git/commitdiff/9b79e9e3431d11e79a4f85268f70130b7b4369f6 – melpomene

+0

@ user15964,你是什麼意思是「不起作用」?請記住'unichars'可以很慢,特別是'-a'和'-u'。它確實將regex參數應用於每個可能的Unicode字符0x110000。 – ikegami

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匹配任何字符,其一般類別爲「標記」,並\p{Pc}匹配它的基本類別是「連接符標點」任何字符。

有關這些類別中的字符的完整列表,我將不得不推遲到Unicode。

+0

@ikegami我很確定「Word」不是Unicode屬性。 – melpomene

+0

非常感謝您的詳細解釋。我沒有想到它會涉及到這麼多事情。但無論如何,我們是否可以簡單地打印'\ pM'和'\ p {Pc}'。此刻,我仍然無法理解屬於'\ pM'或'\ p {PC}'的字符是什麼樣子,看起來像 – user15964