.Net regex: что такое символ character\w?
Простой вопрос:
Каков шаблон символа слова \w
в С#,.net?
Моя первая мысль заключалась в том, что она соответствует [A-Za-z0-9_]
, а документация говорит мне:
Character class Description Pattern Matches
\w Matches any \w "I", "D", "A", "1", "3"
word character. in "ID A1.3"
что не очень полезно.
И \w
, похоже, соответствует äöü
. Что еще? Существует ли лучшее (точное) определение?
Ответы
Ответ 1
В документации :
Символ слова:\w
\w
соответствует любому символу слова. Символ слова является членом любой из категорий Юникода, перечисленных в следующей таблице.
-
Ll
(Letter, Lowercase) -
Lu
(Letter, Uppercase) -
Lt
(Letter, Titlecase) -
Lo
(письмо, другое) -
Lm
(Letter, Modifier) -
Nd
(число, десятичная цифра) -
Pc
(пунктуация, коннектор) - Эта категория включает десять символов, наиболее часто используемым из которых является символ LOWLINE (_), u + 005F.
Если указано поведение, совместимое с ECMAScript, \w
эквивалентно [a-zA-Z_0-9]
.
См. также
Ответ 2
В основном это соответствует всему, что можно считать интуитивным определением буквы в разных сценариях - плюс подчеркивание и несколько других странностей.
Вы можете найти полный список (по крайней мере для BMP) со следующим крошечным фрагментом PowerShell:
0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ }
Ответ 3
Итак, после некоторых исследований с использованием '\ 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
, если символ является символом слова. Это должно быть значительно быстрее, чем с использованием регулярного выражения.
Интересно, что это не соответствует спецификации .NET, ведь "\ w" соответствует символам 938 "NonSpacingMark", которые не упоминаются.
В целом это соответствует 49 760 из 65 535 символов, поэтому простое регулярное выражение, часто отображаемое в Интернете, является неполным.