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


76

一个简单的问题:C#、. net中
的单词字符的模式是什么\w

我首先想到的是它匹配[A-Za-z0-9_]并且文档告诉我:

字符类别描述模式匹配
\ w匹配任何\ w“ I”,“ D”,“ A”,“ 1”,“ 3”
                   文字字符。在“ ID A1.3”中

这不是很有帮助。
并且\w似乎也匹配äöü。还有什么?有更好的(精确)定义吗?

Answers:


115

文档中

文字字元:\ 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)特殊字符(例如_underscore),无论多么疯狂,它都可能与任何单词匹配。并且可能是写类似内容的[a-zA-Z1-9_]+
捷径

15

基本上,它与所有可以视为各种脚本中字母的直观定义的内容相匹配-加上下划线和其他一些奇数。

您可以找到完整的列表(至少对于BMP而言),其中包含以下微小的PowerShell片段:

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

4

因此,经过一些研究,在.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));
}

我将其写为扩展方法,以便在c调用任何字符时都易于使用,如果该字符是单词字符c.IsWord(),则将返回true该字符。这应该比使用Regex快得多。

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

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


谢谢您,您节省了我很多时间。我认为您可能还需要在单词类别中添加“ UnicodeCategory.SpacingCombiningMark”。我正在与孟加拉语(我不会说)一起工作,此类字符是一个重要的单词字符。
D. Tony
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.