.Net регулярные выражения: что такое слово символ \ w? - PullRequest
68 голосов
/ 08 июня 2010

Простой вопрос:
Каков шаблон для символа слова \w в c #, .net?

Сначала я подумал, что он соответствует [A-Za-z0-9_], а документация говорит мне:

<b>Character class    Description          Pattern     Matches</b>
\w                 Matches any          \w          "I", "D", "A", "1", "3"
                   word character.                  in "ID A1.3"

что не очень полезно.
И \w, похоже, тоже соответствует äöü. Что-то еще? Есть ли лучшее (точное) определение?

Ответы [ 3 ]

100 голосов
/ 08 июня 2010

Из документации :

Символ слова: \ w

\w соответствует любому символу слова.Символ слова является членом любой из категорий Unicode, перечисленных в следующей таблице.

  • Ll (буква, строчные буквы)
  • Lu (буква, прописные буквы)
  • Lt (буква, заглавные буквы)
  • Lo (буква, другое)
  • Lm (буква, модификатор)
  • Nd (число, десятичная цифра)
  • Pc (пунктуация,Соединитель)
    • В эту категорию входят десять символов, наиболее часто используемым из которых является символ LOWLINE (_), u + 005F.

Если ECMAScript-указано совместимое поведение, \w эквивалентно [a-zA-Z_0-9].

См. также

14 голосов
/ 08 июня 2010

По сути, оно соответствует всему, что можно считать интуитивным определением буквы в различных сценариях, плюс подчеркивание и несколько других странностей.

Вы можете найти полный список (по крайней мере для BMP) со следующим крошечным фрагментом PowerShell:

0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ }
3 голосов
/ 19 ноября 2015

Так что после некоторого исследования использование \ 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 символов, поэтому простые регулярные выражения, часто показываемые в Интернете, являются неполными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...