.Net正则表达式:什么是单词字符\w?

89
简单问题: 在C#和.NET中,字符“\w”的模式是什么?
我最初的想法是它匹配“[A-Za-z0-9_]”,而文档告诉我:
字符类    描述          模式     匹配
\w       匹配任何单词字符   \w      "I", "D", "A", "1", "3"
                           在"ID A1.3"中
这并没有提供太多帮助。 而且,\w似乎也匹配“äöü”。还有其他的吗?有没有更好(准确)的定义?
3个回答

138
文档中:

单词字符:\w

\w匹配任何单词字符。单词字符是指下表中列出的Unicode类别的成员。

  • Ll(字母,小写)
  • Lu(字母,大写)
  • Lt(字母,标题大小写)
  • Lo(字母,其他)
  • Lm(字母,修饰符)
  • Nd(数字,十进制数字)
  • Pc(标点符号,连接符)
    • 此类别包括十个字符,其中最常用的是LOWLINE字符(_),u+005F。

如果指定了ECMAScript兼容行为,\w等同于[a-zA-Z_0-9]

另请参阅


1
所以,如果我使用\w+,这可能会匹配任何单词,只要它的内容是小写、大写字母、数字1-9和一些(10个)特殊字符(如下划线)。并且这将是编写类似于[a-zA-Z1-9_]+的简写方式。 - Eric Bishard

17

基本上,它匹配各种脚本中可以被认为是直观定义的字母,再加上下划线和其他一些奇怪的字符。

你可以使用以下微小的PowerShell片段找到完整的列表(至少适用于BMP):

0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ }

7

经过一些研究,使用'\w'在.NET中等同于:

public static class Extensions { 
    /// <summary>
    /// The word categories.
    /// </summary>
    [NotNull]
    private static readonly HashSet<UnicodeCategory> _wordCategories = new HashCollection<UnicodeCategory>(
                new[]
                {
            UnicodeCategory.DecimalDigitNumber,
            UnicodeCategory.UppercaseLetter,
            UnicodeCategory.ConnectorPunctuation,
            UnicodeCategory.LowercaseLetter,
            UnicodeCategory.OtherLetter,
            UnicodeCategory.TitlecaseLetter,
            UnicodeCategory.ModifierLetter,
            UnicodeCategory.NonSpacingMark,
                });

    /// <summary>
    /// Determines whether the specified character is a word character (equivalent to '\w').
    /// </summary>
    /// <param name="c">The c.</param>
    public static bool IsWord(this char c) => _wordCategories.Contains(char.GetUnicodeCategory(c));
}

我将这段代码写成了扩展方法,以便在任何字符 c 上使用时更加方便。只需调用 c.IsWord(),如果该字符是单词字符,则返回 true 。这比使用正则表达式快得多。
有趣的是,这似乎与.NET规范不匹配,实际上'\w'与938个“NonSpacingMark”字符匹配,而这些字符并没有被提及。
总的来说,这匹配了65,535个字符中的49,760个,因此网站上经常显示的简单正则表达式是不完整的。

谢谢你,你帮我省了很多时间。我认为你还需要将“UnicodeCategory.SpacingCombiningMark”添加到单词类别中。我正在处理孟加拉语(我不会说),这类字符是重要的单词字符。 - D. Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接