.Net regex: ¿cuál es la palabra character \ w?

Pregunta simple:
¿Cuál es el patrón de la palabra character \w en c #, .net?

Lo primero que pensé fue que coincide con [A-Za-z0-9_] y la documentación me dice:

 Clase de personaje Descripción Patrón Partidos
 \ w Coincide con cualquier \ w "I", "D", "A", "1", "3"
                    personaje de palabra  en "ID A1.3"

que no es muy útil.
Y \w parece coincidir con äöü , también. ¿Qué más? ¿Hay una mejor definición (exacta) disponible?

De la documentación :

Personaje de la palabra: \ w

\w coincide con cualquier carácter de palabra. Un carácter de palabra es miembro de cualquiera de las categorías Unicode enumeradas en la siguiente tabla.

  • Ll (letra, minúscula)
  • Lu (letra, mayúscula)
  • Lt (Letter, Titlecase)
  • Lo (letra, otro)
  • Lm (Carta, Modificador)
  • Nd (Número, Dígito Decimal)
  • Pc (puntuación, conector)
    • Esta categoría incluye diez caracteres, el más utilizado es el carácter LOWLINE (_), u + 005F.

Si se especifica el comportamiento compatible con ECMAScript, \w es equivalente a [a-zA-Z_0-9] .

Ver también

  • Base de datos de caracteres Unicode
  • Caracteres Unicode en la categoría ‘Puntuación, Conector’

Básicamente, coincide con todo lo que se puede considerar la definición intuitiva de la letra en varios guiones, más el guión bajo y algunos otros bichos raros.

Puede encontrar una lista completa (al menos para el BMP) con el siguiente pequeño fragmento de PowerShell:

 0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ } 

Entonces, después de algunas investigaciones que usan ‘\ w’ en .NET es equivalente a:

 public static class Extensions { ///  /// The word categories. ///  [NotNull] private static readonly HashSet _wordCategories = new HashCollection( new[] { UnicodeCategory.DecimalDigitNumber, UnicodeCategory.UppercaseLetter, UnicodeCategory.ConnectorPunctuation, UnicodeCategory.LowercaseLetter, UnicodeCategory.OtherLetter, UnicodeCategory.TitlecaseLetter, UnicodeCategory.ModifierLetter, UnicodeCategory.NonSpacingMark, }); ///  /// Determines whether the specified character is a word character (equivalent to '\w'). ///  /// The c. public static bool IsWord(this char c) => _wordCategories.Contains(char.GetUnicodeCategory(c)); } 

He escrito esto como un método de extensión para que sea fácil de usar en cualquier carácter c solo invoque c.IsWord() que devolverá true si el carácter es un carácter de palabra. Esto debería ser significativamente más rápido que usar un Regex.

Curiosamente, esto no parece coincidir con la especificación .NET, de hecho ‘\ w’ coincide con 938 caracteres ‘NonSpacingMark’, que no se mencionan.

En total, esto coincide con 49.760 de los 65.535 caracteres, por lo que las expresiones regulares simples que a menudo se muestran en la web son incompletas.