2014-08-28 45 views
0

我做了嘗試從以下字符串獲得服務器名正則表達式模式:如果可能,使用'?'時,正則表達式總是匹配0量詞?

/SERVER "\"TEST_SERVER\"" 

有時引號和反斜槓被省略,所以該字符串只是看起來像:

/SERVER TEST_SERVER 

在這兩種情況下,我只想匹配TEST_SERVER。 我的模式是這樣的:

(?<=/SERVER ("\\")?)\S+(?=(\\"")?) 

但這只是匹配整個字符串"\"TEST_SERVER\""時,有引號和反斜槓它。我在這裏做錯了什麼?

我在C#中這樣做,這是我的代碼:

string input2 = "/SERVER \"\\\"TEST_SERV\\\"\""; 
string pattern = @"(?<=/SERVER (""\\"")?)\S+(?=(\\"""")?)"; 
Console.WriteLine("pattern=" + pattern); 
Console.WriteLine("input=" + input2); 

Regex regEx = new Regex(pattern); 
MatchCollection matches = regEx.Matches(input2); 
foreach (var match in matches) 
{ 
    Console.WriteLine(match.ToString()); 
} 

Console.ReadKey(); 
+0

郎,你運行的? – 2014-08-28 11:24:46

+0

我正在使用C#,我已經包含了我正在使用的代碼。 – 2014-08-28 11:25:48

回答

1

你可以試試下面的正則表達式的字符串TEST_SERVER匹配,

(?<=\/SERVER\s*(?:["\\]+)?)\w+(?=(?:[\\"]+|$)) 

C#代碼會是這樣,

String input = @"/SERVER ""\""TEST_SERVER\"""""; 
Regex rgx = new Regex(@"(?<=\/SERVER\s*(?:[""\\]+)?)\w+(?=(?:[\\""]+|$))"); 
foreach (Match m in rgx.Matches(input)) 
Console.WriteLine(m.Groups[0].Value); 

IDEONE 1 IDEONE 2

+0

謝謝,這個工程,在?([:\「\\] +)中做什麼? – 2014-08-28 11:31:56

+1

'(?:)'稱爲非捕獲組,它只做一個匹配操作,它不會捕獲任何東西。'[\\「] +'表示匹配一個或多個''''或'''符號。 – 2014-08-28 11:34:14

1

請嘗試以下方法:

string input1 = @"/SERVER TEST_SERVER"; 
string input2 = @"/SERVER ""\""TEST_SERVER\"""""; 

string pattern = @"^/SERVER (""\\"")?(?<NAME>.+?)(\\"""")?$"; 

var regEx = new Regex(pattern); 

Console.WriteLine(regEx.Match(input1).Groups["NAME"].Value); 
Console.WriteLine(regEx.Match(input2).Groups["NAME"].Value);