Отже, після деяких досліджень використання '\ w' у .NET еквівалентно:
public static class Extensions {
[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,
});
public static bool IsWord(this char c) => _wordCategories.Contains(char.GetUnicodeCategory(c));
}
Я написав це як метод розширення, щоб його було легко використовувати на будь-якому символі, який cпросто викликається, c.IsWord()який повернеться, trueякщо символ є символом слова. Це має бути значно швидше, ніж використання регулярного виразу.
Цікаво, що це, схоже, не відповідає специфікації .NET, насправді '\ w' відповідає 938 символам 'NonSpacingMark', які не згадуються.
Загалом це збігається з 49 760 із 65 535 символів, тому прості регулярні вирази, часто показані в Інтернеті, є неповними.
\w+це, це могло б збігатися з будь-яким словом, яким би божевільним він не був, поки його вміст - або малі, великі літери, цифри 1-9 та кілька (10) спеціальних символів (наприклад, підкреслення). І це було б скороченням для написання чогось на кшталт[a-zA-Z1-9_]+