web-dev-qa-db-ja.com

.Net正規表現:Wordの文字\ wとは何ですか?

簡単な質問:
C#、. netのWord文字\wのパターンは何ですか?

最初に考えたのは、[A-Za-z0-9_]と一致し、 documentation が次のことを示していることです。

文字クラス説明パターン一致
\w任意の\ w "I"、 "D"、 "A"、 "1"、 "3" 
単語文字に一致します。 「ID A1.3」

これはあまり役に立ちません。
そして\wäöüと一致するようです。ほかに何か?より良い(正確な)定義が利用可能ですか?

68
tanascius

ドキュメント から:

単語文字:\ w

\wは、すべてのWord文字に一致します。 Word文字は、次の表にリストされているUnicodeカテゴリのメンバーです。

  • Ll(文字、小文字)
  • Lu(文字、大文字)
  • Lt(レター、タイトルケース)
  • Lo(レター、その他)
  • Lm(文字、修飾子)
  • Nd(数字、10進数)
  • Pc(句読点、コネクタ)
    • このカテゴリには10個の文字が含まれ、最も一般的に使用されるのはLOWLINE文字(_)、u + 005Fです。

ECMAScript準拠の動作が指定されている場合、\w[a-zA-Z_0-9]と同等です。

こちらもご覧ください

101

基本的に、さまざまなスクリプトでのletterの直観的な定義と考えられるすべてのものに加えて、アンダースコアと他のいくつかの奇妙なものに一致します。

次の小さなPowerShellスニペットで完全なリストを見つけることができます(少なくともBMPの場合)。

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

したがって、.NETで「\ w」を使用していくつかの調査を行った後は、次と同等です。

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で簡単に使用できるように拡張メソッドとして作成しました。文字がWord文字の場合にtrueを返すc.IsWord()を呼び出すだけです。これは、正規表現を使用するよりも大幅に高速です。

興味深いことに、これは.NET仕様と一致していないようです。実際、 '\ w'は938の 'NonSpacingMark'文字と一致しますが、これらは言及されていません。

合計で、これは65,535文字のうちの49,760文字と一致するため、Webに表示されることが多い単純な正規表現は不完全です。

4
thargy