2010-06-22 33 views
1

我想採取的說串了以下內容:正則表達式 - 如何找話和引用的短語

Guiness Harp "Holy Moses" 

因此,在C#或VB獲得匹配組:

Guiness 
Harp 
Holy Moses 

本質上,它分裂在空間上,除非空格周圍有引號,那麼引號之間的單詞被認爲是單個短語。

感謝, 凱文

+2

不是一個真正的正則表達式的工作 – SilentGhost 2010-06-22 17:25:42

回答

5

如果你沒有任何(轉義或一倍),您引用的字符串引號內,您可以搜索

"[^"]*"|\S+ 

然而,行情將是部分比賽。正則表達式可以擴展爲在必要時處理帶引號的字符串中的引號。

另一個(在這種情況下更可取的)可能性是使用csv解析器。

對於示例(Python):

import csv 
reader = csv.reader(open('test.txt'), delimiter=' ', quotechar='"') 
for row in reader: 
    print(row) 
+0

是的,使用像這樣的現有解析器肯定比嘗試重新創建一個更有意義。哦,並祝賀獲得10k代表。 :) – 2010-06-22 17:32:23

+0

對於這個簡單的應用程序,我有我不擔心逃脫字符。在這種情況下,應用程序的用戶不多,而我從RegEx獲得的收益大於負值。我還發現了另一個 - 更加複雜的表達方式,也可以取出引號。它可能會做其他事情,但正則表達式對我的技能組不高。 (?<=(?:^| \ s |,)「)[^」] *?(?=「)|(?<= \ s | ^)(?!」)[\ w \ W] +?(?= \ s | $) 感謝您的幫助! Kevin – Grandizer 2010-06-22 18:21:24

+0

@彼得:謝謝!看起來你是下一個:) – 2010-06-22 19:19:06

0

正則表達式無法計數,這使得分隔符解析困難。

我會使用一個解析器,而不是正則表達式。

0

如果這是一個簡單的解析,您可能可以修剪開始和結束的引號。

string text = "Guiness Harp \"Holy Moses\""; 
string pattern = @"""[^""]*""|\S+"; 

MatchCollection matches = Regex.Matches(text, pattern); 
foreach(Match match in matches) 
{ 
    string value = match.Value.Trim('"'); 
    Console.Out.WriteLine(value); 
} 

但是,這個實現不是很靈活。我只能在內部工具中使用這樣的東西。或者你不介意丟掉你的代碼。

3

這裏的另一種方法:

string s0 = @"Guiness Harp ""Holy Moses"""; 
Regex r = new Regex(@"""(?<FIELD>[^""]*)""|(?<FIELD>\S+)"); 
foreach (Match m in r.Matches(s0)) 
{ 
    Console.WriteLine(m.Groups["FIELD"].Value); 
} 

這需要的是,.NET的正則表達式讓你重複使用相同的正則表達式中的組名的優勢。很少有正則表達式允許這樣做,只有那些Perl 6和.NET一樣靈活。

相關問題