Так что после некоторого исследования использование \ w в .NET эквивалентно:
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, которые не упомянуты.*
В целом это соответствует 49 760 из 65 535 символов, поэтому простые регулярные выражения, часто показываемые в Интернете, являются неполными.