2014-08-29 2 views
0

я делаю регулярное выражение, которое пытается соответствовать следующей строке:Regex матч между двумя строками, которые могут содержать другую строку

.\SQL2012 

Из двух строк (они содержатся в другой большую строке, но это не имеет значения в данном случае):

/SERVER "\".\SQL2012\"" 
/SERVER .\SQL2012 

Так "\" раньше, и \"" после матча оба могут быть опущены в некоторых случаях. Регулярное выражение я придумал (из предыдущего вопроса здесь, на StackOverflow) заключается в следующем:

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

Который работает отлично, если я пытаюсь соответствовать TEST_SERVER вместо .\SQL2012 (потому что \w не соответствует специальным символам). Есть ли способ подобрать что-либо до \"" или пробелы?

Я делаю это в C#, вот мой код:

string input = "/SERVER \"\\\".\\SQL2012\\\"\""; 
string pattern = @"(?<=\/SERVER\s*(?:[""\\""]+)?)\w+(?=(?:[\\""""]+|$)|)"; 
Regex regEx = new Regex(pattern); 
MatchCollection matches = regEx.Matches(input); 
foreach (Match match in matches) 
{ 
    Console.WriteLine(match.ToString()); 
} 
Console.ReadKey(); 
+0

Это пахнет X/Проблема Y: у вас проблема X, вы думаете, что можете решить ее с помощью решения Y, вы обнаружили проблему в решении Y, и теперь вы просите решение своей проблемы в решении Y, в то время как решение Y не может t быть лучшим способом решения проблемы X. Что такое проблема X? – Nzall

+0

@NateKerkhofs Это может быть самый запутанный комментарий, который я прочитал на SO. Я не понимаю, как вопрос непонятен сам по себе. –

+0

Вопрос совершенно понятен сам по себе, это правда. Я говорю о http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem. Ваше Regex пытается решить проблему, которая нам неизвестна. Однако ваше Regex может не быть лучшим решением проблемы. Меня интересует, что проблема в том, что вы пытаетесь решить, используя Regex, в случае, если есть лучшее решение для решения проблемы, чем Regex. – Nzall

ответ

1

Добавить границу слова \b непосредственно перед к упреждающей выборке,

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

IDEONE

+0

Это соответствует "\". \ SQL2012 –

+0

всего лишь минута ... –

+0

@ soren.qvist см. Мой обновленный ответ. –

Смежные вопросы