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

Posted

技术标签:

【中文标题】.Net 正则表达式:单词字符 \\w 是啥?【英文标题】:.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 似乎也匹配 äöü。还有什么?有更好的(准确的)定义吗?

【问题讨论】:

【参考方案1】:

来自documentation:

字字符:\w

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

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

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

另见

Unicode Character Database Unicode Characters in the 'Punctuation, Connector' Category

【讨论】:

所以如果我使用\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”添加到单词类别中。我正在使用孟加拉语(我不会说),这类字符是一个重要的单词字符。

以上是关于.Net 正则表达式:单词字符 \w 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

正则表达式——7.4 单词边界

python 正则表达式

正则表达式中的 ^ 和 $ 是啥意思?

正则表达式中的 ^ 和 $ 是啥意思?

正则表达式中的 ^ 和 $ 是啥意思?