代码之家  ›  专栏  ›  技术社区  ›  tanascius

.NET regex:什么是字符\w?

  •  65
  • tanascius  · 技术社区  · 14 年前

    简单问题:
    这个词的句型是什么 \w 在C.net,.NET中?

    我的第一个想法是它符合 [A-Za-z0-9_] 以及 documentation 告诉我:

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

    这不是很有帮助。
    \w 似乎相配 äöü 也是。还有什么?是否有更好(准确)的定义?

    3 回复  |  直到 9 年前
        1
  •  95
  •   Owen Blacker Aditya    10 年前

    documentation :

    字字符:\w

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

    • Ll (字母,小写)
    • Lu (字母,大写)
    • Lt (字母,标题)
    • Lo (信件,其他)
    • Lm (字母、修饰语)
    • Nd (数字,十进制数字)
    • Pc (标点符号、连接符)
      • 这个类别包括十个字符,其中最常用的是下线字符(_u),u+005f。

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

    也见

        2
  •  14
  •   Joey Gumbo    14 年前

    基本上,它符合所有可以被认为是直观定义的 在各种脚本中,加上下划线和一些其他奇怪的东西。

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

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

    因此,在.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”字符匹配,但没有提到。

    总的来说,这与65535个字符中的49760个匹配,因此通常在Web上显示的简单regex是不完整的。