【问题标题】:.Net regex: what is the word character \w?.Net 正则表达式:单词字符 \w 是什么?
【发布时间】:2011-03-01 05:20:55
【问题描述】:

简单的问题:
c#、.net中\w这个词的模式是什么?

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

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

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

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    来自documentation

    字字符:\w

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

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

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

    另见

    【讨论】:

    • 所以如果我使用\w+,这可能会匹配任何单词,无论它多么疯狂,只要它的内容是小写字母、大写字母、数字 1-9 和几 (10) 个特殊字符(如 _underscore)。并且是写[a-zA-Z1-9_]+之类的简写
    【解决方案2】:

    基本上,它与各种脚本中可以被视为 letter 的直观定义的所有内容相匹配——加上下划线和其他一些奇怪的东西。

    您可以使用以下小型 PowerShell sn-p 找到完整列表(至少对于 BMP):

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

    【讨论】:

      【解决方案3】:

      所以经过一些研究,在 .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。这应该比使用正则表达式快得多。

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

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

      【讨论】:

      • 感谢您,您为我节省了很多时间。我认为您可能还需要将“UnicodeCategory.SpacingCombiningMark”添加到单词类别中。我正在使用孟加拉语(我不会说),这类字符是一个重要的单词字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      相关资源
      最近更新 更多