これまでのところ、これは RegEx の有力な候補のようです。より複雑になる場合は、より複雑なトークン化スキームが必要になる可能性がありますが、作業が大幅に増えるため、必要な場合を除き、そのルートは避ける必要があります。(一方、複雑なスキーマの場合、正規表現はすぐに犬に変わるため、同様に避ける必要があります)。
この正規表現はあなたの問題を解決するはずです:
("[^"]+"|\w+)\s*
以下は、C# での使用例です。
string data = "the quick \"brown fox\" jumps over the \"lazy dog\"";
string pattern = @"(""[^""]+""|\w+)\s*";
MatchCollection mc = Regex.Matches(data, pattern);
foreach(Match m in mc)
{
string group = m.Groups[0].Value;
}
この方法の本当の利点は、次のように「-」要件を含めるように簡単に拡張できることです。
string data = "the quick \"brown fox\" jumps over " +
"the \"lazy dog\" -\"lazy cat\" -energetic";
string pattern = @"(-""[^""]+""|""[^""]+""|-\w+|\w+)\s*";
MatchCollection mc = Regex.Matches(data, pattern);
foreach(Match m in mc)
{
string group = m.Groups[0].Value;
}
今、私は次の男と同じくらい正規表現を読むのが嫌いですが、それを分割すると、これは非常に読みやすいです:
(
-"[^"]+"
|
"[^"]+"
|
-\w+
|
\w+
)\s*
説明
- 可能であれば、マイナス記号に一致し、その後に " が続き、次の " までのすべてが続きます。
- それ以外の場合は、" に続き、次の " までのすべてに一致します。
- それ以外の場合は、任意の単語文字が続く - に一致します
- それ以外の場合は、できるだけ多くの単語文字に一致します
- 結果をグループに入れる
- 後続の空白文字をすべて飲み込む