Einfache Frage:
Wie lautet das Muster für das Wortzeichen \w
in 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 \w
scheint auch zu passen äöü
. Was sonst? Gibt es eine bessere (genaue) Definition?
\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_]+
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]$_ }
quelle
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
c
gerade aufgerufene Zeichen zu verwenden ,c.IsWord()
das zurückgegeben wird,true
wenn 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.
quelle