.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
似乎也匹配 äöü
。还有什么?有更好的(准确的)定义吗?
【问题讨论】:
【参考方案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 是啥?的主要内容,如果未能解决你的问题,请参考以下文章