到目前爲止,這看起來像一個很好的候選人正則表達式的。如果它變得複雜得多,那麼可能需要一個更復雜的標記化方案,但除非必要,否則您應該避開該路線,因爲它的工作量要大得多。 (另一方面,對於複雜的模式,正則表達式很快就會變成一隻狗,同樣應該避免)。
此正則表達式應該解決您的問題:
("[^"]+"|\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;
}
現在我討厭閱讀正規表達式的下一個顧Y,但如果你把它分解了,這個人是很容易閱讀:
(
-"[^"]+"
|
"[^"]+"
|
-\w+
|
\w+
)\s*
說明
- 如果可能的匹配一個減號,然後是「後面的一切,直到下一個「
- 否則匹配」,後面的一切,直到下一個「
- 否則匹配 - 其次是任何文字字符
- 否則匹配儘可能多的單詞字符,你可以
- 把結果一組
- 在吞掉任何下列空格字符
在你的語法,可以在雙引號(「)的其他任何地方使用,除了說明令牌多字? – 2009-12-10 19:03:39
對於我而言,沒有它做不到。 – jamesaharvey 2009-12-10 19:04:48