.Net Regex: Was ist das Wort Zeichen \ w?

76

Einfache Frage:
Wie lautet das Muster für das Wortzeichen \win c #, .net?

Mein erster Gedanke war, dass es passt [A-Za-z0-9_]und die Dokumentation sagt mir:

Zeichenklasse Beschreibung Musterübereinstimmungen
\ w Entspricht jedem \ w "I", "D", "A", "1", "3"
                   Wortzeichen. in "ID A1.3"

das ist nicht sehr hilfreich.
Und \wscheint auch zu passen äöü. Was sonst? Gibt es eine bessere (genaue) Definition?

Tanascius
quelle

Antworten:

115

Aus der Dokumentation :

Wortzeichen: \ w

\wEntspricht einem beliebigen Wortzeichen. Ein Wortzeichen ist Mitglied einer der in der folgenden Tabelle aufgeführten Unicode-Kategorien.

  • Ll (Brief, Kleinbuchstaben)
  • Lu (Brief, Großbuchstaben)
  • Lt (Brief, Titelkoffer)
  • Lo (Brief, Andere)
  • Lm (Buchstabe, Modifikator)
  • Nd (Zahl, Dezimalstelle)
  • Pc (Interpunktion, Konnektor)
    • Diese Kategorie umfasst zehn Zeichen, von denen das am häufigsten verwendete das LOWLINE-Zeichen (_) u + 005F ist.

Wenn ECMAScript-kompatibles Verhalten angegeben \wist, entspricht dies [a-zA-Z_0-9].

Siehe auch

Polygenschmierstoffe
quelle
1
Wenn ich \w+dies verwenden würde, würde dies möglicherweise zu jedem Wort passen, egal wie verrückt es ist, solange der Inhalt entweder aus Klein-, Großbuchstaben, Zahlen 1-9 und einigen (10) Sonderzeichen (wie dem _underscore) besteht. Und wäre eine Abkürzung für das Schreiben von so etwas wie[a-zA-Z1-9_]+
Eric Bishard
15

Grundsätzlich passt es zu allem, was als intuitive Definition von Buchstaben in verschiedenen Skripten angesehen werden kann - plus dem Unterstrich und einigen anderen merkwürdigen Kugeln.

Sie finden eine vollständige Liste (zumindest für das BMP) mit dem folgenden kleinen PowerShell-Snippet:

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

Nach einigen Recherchen entspricht die Verwendung von '\ w' in .NET also:

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

Ich habe dies als Erweiterungsmethode geschrieben, um es einfach für jedes cgerade aufgerufene Zeichen zu verwenden , c.IsWord()das zurückgegeben wird, truewenn das Zeichen ein Wortzeichen ist. Dies sollte erheblich schneller sein als die Verwendung eines Regex.

Interessanterweise scheint dies nicht mit der .NET-Spezifikation übereinzustimmen. Tatsächlich entspricht '\ w' 938 'NonSpacingMark'-Zeichen, die nicht erwähnt werden.

Insgesamt entspricht dies 49.760 der 65.535 Zeichen, sodass die im Web häufig angezeigten einfachen regulären Ausdrücke unvollständig sind.

Thargie
quelle
Danke dafür, du hast mir viel Zeit gespart. Ich denke, Sie müssen möglicherweise auch "UnicodeCategory.SpacingCombiningMark" zu den Wortkategorien hinzufügen. Ich habe mit Bengali gearbeitet (was ich nicht spreche) und diese Klasse von Charakteren ist ein wichtiges Wort.
D. Tony