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

tan*_*ius 70 .net c# regex

简单的问题:c#,.net中
字符的模式是什么\w

我的第一个想法是它匹配[A-Za-z0-9_],文档告诉我:

Character class    Description          Pattern     Matches
\w                 Matches any          \w          "I", "D", "A", "1", "3"
                   word character.                  in "ID A1.3"

这不是很有帮助.
而且\w似乎也匹配äöü.还有什么?是否有更好的(确切的)定义?

pol*_*nts 103

文档:

单词字符:\ w

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

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

如果指定了符合ECMAScript的行为,\w则等效于[a-zA-Z_0-9].

也可以看看


Joe*_*oey 14

基本上它匹配所有可以被认为是各种脚本中字母的直观定义的东西- 加上下划线和一些其他古怪的东西.

您可以使用以下微小的PowerShell代码段找到完整列表(至少对于BMP):

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


tha*_*rgy 6

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

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));
}
Run Code Online (Sandbox Code Playgroud)

我已经把它写成一个扩展方法,以便于在任何字符上使用,c只要调用c.IsWord()它就会true在字符是单词字符时返回。这应该比使用正则表达式快得多。

有趣的是,这似乎与 .NET 规范不匹配,实际上 '\w' 匹配 938 个未提及的 'NonSpacingMark' 字符。

这总共匹配了 65,535 个字符中的 49,760 个,因此网络上经常显示的简单正则表达式是不完整的。