Подтвердить что ты не робот

.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, похоже, соответствует äöü. Что еще? Существует ли лучшее (точное) определение?

4b9b3361

Ответ 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 символов, поэтому простое регулярное выражение, часто отображаемое в Интернете, является неполным.