.net regex: Qual é a palavra personagem w?

pergunta simples:
Qual é o padrão para o personagem da palavra \w em c#, .net?

o meu primeiro pensamento foi que corresponde [A-Za-z0-9_] e a documentação diz-me:

Character class    Description          Pattern     Matches
\w                 Matches any          \w          "I", "D", "A", "1", "3"
                   word character.                  in "ID A1.3"
O que não ajuda muito.
E \w parece corresponder äöü, também. Que mais? Existe uma definição melhor (exata) disponível?

Author: tanascius, 2010-06-08

3 answers

  • Pc (Pontuação, Conector)
    • esta categoria inclui dez caracteres, dos quais o mais utilizado é o carácter de linha baixa ( _ ), u+005F.
  • Se for especificado um comportamento conforme com o ECMAScript, \w é equivalente a [a-zA-Z_0-9].

    Ver também

     90
    Author: polygenelubricants, 2014-04-01 13:17:31

    Basicamente corresponde a tudo o que pode ser considerado a definição intuitiva de letra em vários scripts – mais o underscore e algumas outras oddballs.

    Poderá encontrar uma lista completa (pelo menos para o BMP) com o seguinte pequeno excerto de PowerShell:

    0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ }
    
     13
    Author: Joey, 2010-06-08 15:00:48

    Assim, após algumas pesquisas usando '\w ' em. NET é equivalente a:

    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));
    }
    

    Escrevi isto como um método de extensão para ser fácil de usar em qualquer carácter {[1] } Basta invocar c.IsWord() que irá retornar true Se o carácter for um carácter de palavra. Isto deve ser significativamente mais rápido do que a utilização de um Regex.

    [[5]}curiosamente, isto não parece corresponder à especificação. NET, de facto '\w' corresponde a 938 caracteres 'NonSpacingMark', que não são mencionados.

    No total, isto corresponde 49.760 dos 65.535 caracteres, de modo que o simples "regex" é frequentemente mostrado na web estão incompletos.

     3
    Author: thargy, 2015-11-19 16:13:47