一个简单的问题:C#、. net中
的单词字符的模式是什么\w
?
我首先想到的是它匹配[A-Za-z0-9_]
并且文档告诉我:
字符类别描述模式匹配 \ w匹配任何\ w“ I”,“ D”,“ A”,“ 1”,“ 3” 文字字符。在“ ID A1.3”中
这不是很有帮助。
并且\w
似乎也匹配äöü
。还有什么?有更好的(精确)定义吗?
Answers:
从文档中:
文字字元:\ w
\w
匹配任何单词字符。单词字符是下表列出的任何Unicode类别的成员。
Ll
(小写字母)Lu
(大写字母)Lt
(字母,标题)Lo
(其他)Lm
(字母,修饰符)Nd
(数字,十进制数字)Pc
(标点,连接器)
- 此类别包括十个字符,其中最常用的是LOWLINE字符(_),即u + 005F。
如果指定了ECMAScript兼容行为,
\w
则等效于[a-zA-Z_0-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”字符匹配,未提及。
总共与65,535个字符中的49,760个匹配,因此在网络上经常显示的简单正则表达式是不完整的。
\w+
此字词,那么无论该字词的内容是小写,大写字母,数字1-9还是几个(10)特殊字符(例如_underscore),无论多么疯狂,它都可能与任何单词匹配。并且可能是写类似内容的[a-zA-Z1-9_]+