2013-04-10 6 views
1

Так у меня есть текстовый файл, который кормит меня разделенные запятой данные, заключенные в двойные кавычки, например, так:RegEx раскол не дает ожидаемых результатов

string test = "\"foo\",\"bar\",\"1\",\"\",\"baz\""; 

Я хочу, чтобы захватить все значения, первоначально я просто разделить на запятая, но я заметил, иногда вещи были запятые между кавычками, поэтому я изменил его вместо этого использовать регулярные выражения, чтобы просто вытащить все кавычки с очень простым регулярным выражением:

string pattern = "\"[^\"]*\""; 

Использование regexpal это возвращает именно то, что я хочу, но по тем или иным причинам, когда я запускаю этот небольшой про грамм в C#, я получаю список всех запятых, вместо значений, которые меня действительно интересуют, я не совсем уверен, почему. Может ли кто-нибудь определить мою ошибку?

string test = "\"foo\",\"bar\",\"1\",\"\",\"baz\""; 
string pattern = "\"[^\"]*\""; 
string[] lines = Regex.Split(test, pattern); //Returns a list of commas in quotes 

ответ

4

Это потому, что Regex.Split использует шаблон, чтобы решить, где последовательность должна быть разделена. Другими словами, шаблон описывает разделители, а не содержание, которое вы хотели бы, чтобы захватить:

Разделяет входную строку в массив подстрок в позициях, определенных шаблоном регулярного выражения

чтобы использовать выражение так, как вы хотите, вам нужно позвонить Regex.Matches получить MatchCollection и извлекать отдельные матчи из этой коллекции:

string test = "\"foo\",\"bar\",\"1\",\"\",\"baz\""; 
string pattern = "\"[^\"]*\""; 
MatchCollection mc = Regex.Matches(test, pattern); 
foreach (var m in mc) { 
    Console.WriteLine(m); 
} 

Вот demo on ideone.

+0

А, я вижу, это имеет смысл. Я полагаю, что на самом деле я хочу RegEx.Match или что-то еще, или уточню свой RegEx, чтобы фактически использовать разделитель, а не то, что я хочу сопоставить. Благодарю. –

+0

ОК, получил его работу, также использовал этот вопрос http://stackoverflow.com/questions/11416191/how-to-convert-matchcollection-to-string-array для преобразования коллекции совпадений обратно в строковый массив, чтобы просто подключить его прямо туда, где был мой старый наивный код разделения. (Принят, когда это позволит мне, еще раз спасибо!). –

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