【发布时间】:2011-03-01 05:20:55
【问题描述】:
简单的问题:
c#、.net中\w这个词的模式是什么?
我的第一个想法是它与[A-Za-z0-9_] 匹配,documentation 告诉我:
这不是很有帮助。\w 似乎也匹配 äöü。还有什么?有更好的(准确的)定义吗?
【问题讨论】:
简单的问题:
c#、.net中\w这个词的模式是什么?
我的第一个想法是它与[A-Za-z0-9_] 匹配,documentation 告诉我:
这不是很有帮助。\w 似乎也匹配 äöü。还有什么?有更好的(准确的)定义吗?
【问题讨论】:
字字符:\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_]+之类的简写
基本上,它与各种脚本中可以被视为 letter 的直观定义的所有内容相匹配——加上下划线和其他一些奇怪的东西。
您可以使用以下小型 PowerShell sn-p 找到完整列表(至少对于 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。这应该比使用正则表达式快得多。
有趣的是,这似乎与 .NET 规范不匹配,实际上 '\w' 匹配 938 个未提及的 'NonSpacingMark' 字符。
总共匹配 65,535 个字符中的 49,760 个,因此网络上经常显示的简单正则表达式是不完整的。
【讨论】: