.Net正则expression式:什么是字符\ w?
简单的问题:
c# \w
net中字符\w
的模式是什么?
我首先想到的是它匹配[A-Za-z0-9_]
, 文档告诉我:
字符类描述模式匹配 \ w匹配\ w“我”,“D”,“A”,“1”,“3” 单词字符。 在“ID A1.3”
这不是很有帮助。
而且\w
似乎与äöü
相匹配。 还有什么? 有更好的(确切的)定义吗?
从文档 :
字符:\ w
\w
匹配任何单词字符。 单词字符是下表中列出的任何Unicode类别的成员。
Ll
(Letter,小写)Lu
(字母,大写)Lt
(Letter,Titlecase)Lo
(Letter,Other)Lm
(Letter,Modifier)Nd
(数字,十进制数字)Pc
(标点,连接器)
- 这个类别包含10个字符,其中最常用的是LOWLINE字符(_),u + 005F。
如果指定了符合ECMAScript的行为,则
\w
等同于[a-zA-Z_0-9]
。
也可以看看
- Unicode字符数据库
- “标点,连接器”类别中的Unicode字符
基本上它匹配所有可以被认为是字母在各种脚本中的直觉定义的东西 – 加上下划线和其他一些古怪的东西。
您可以使用以下小小的PowerShell代码片段find一个完整列表(至less对于BMP):
0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ }
因此,在.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
。 这应该比使用正则expression式快得多。
有趣的是,这看起来不符合.NET规范,实际上'\ w'匹配938'NonSpacingMark'字符,这是没有提及的。
总共有65535个字符中的49,760个匹配,所以web上经常显示的简单正则expression式是不完整的。