簡単な質問:
C#、. netのWord文字\w
のパターンは何ですか?
最初に考えたのは、[A-Za-z0-9_]
と一致し、 documentation が次のことを示していることです。
文字クラス説明パターン一致 \w任意の\ w "I"、 "D"、 "A"、 "1"、 "3" 単語文字に一致します。 「ID A1.3」
これはあまり役に立ちません。
そして\w
もäöü
と一致するようです。ほかに何か?より良い(正確な)定義が利用可能ですか?
ドキュメント から:
単語文字:\ w
\w
は、すべてのWord文字に一致します。 Word文字は、次の表にリストされているUnicodeカテゴリのメンバーです。
Ll
(文字、小文字)Lu
(文字、大文字)Lt
(レター、タイトルケース)Lo
(レター、その他)Lm
(文字、修飾子)Nd
(数字、10進数)Pc
(句読点、コネクタ)
- このカテゴリには10個の文字が含まれ、最も一般的に使用されるのはLOWLINE文字(_)、u + 005Fです。
ECMAScript準拠の動作が指定されている場合、
\w
は[a-zA-Z_0-9]
と同等です。
基本的に、さまざまなスクリプトでのletterの直観的な定義と考えられるすべてのものに加えて、アンダースコアと他のいくつかの奇妙なものに一致します。
次の小さなPowerShellスニペットで完全なリストを見つけることができます(少なくともBMPの場合)。
0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ }
したがって、.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に表示されることが多い単純な正規表現は不完全です。