当使用'?'时,正则表达式总是匹配0量词?

时间:2014-08-28 11:23:39

标签: c# regex

我正在尝试使用以下字符串获取服务器名称的正则表达式模式:

/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();

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);