2015-10-22 4 views
3

Я пытаюсь разобрать строку и разделить ее на некоторые разделители, в том числе разделители.Как я могу разбить строку в зависимости от ее содержимого?

Например, из строки if(a>b) write(a); Я хочу, чтобы получить if, (, a, >, b, ), write, (, a, ), ;

Вот что я пробовал:

string pattern = "(" + String.Join("|", delimiters.Select(d =>Regex.Escape(d)).ToList()) + ")"; 
List<string> result = Regex.Split(line, pattern).ToList(); 

Это работает, но в некоторых случаях это терпит неудачу. Если бы у меня была строка if(a>0) write("it is positive");, я бы не хотел получать "it, is, positive" (потому что пространство является разделителем), но "it is positive". Как я могу это сделать?

+1

Вы просто хотите, чтобы соответствовать C-строки? Это решаемый вопрос, здесь есть много таких вопросов. Попробуйте добавить ['@" "" [^ "" \\] * (?: \\. [^ "" \\] *) * "" "'] (http://regexstorm.net/tester?p= % 22% 5b% 5e% 22% 5C% 5C% 5d * (% 3f% 3a% 5c% 5с.% 5b% 5e% 22% 5C% 5C% 5d *) *% 22 & я =% 22some% 5cnstring% 22) , –

+0

Не только матч, но и разделение строки. – user1012732

+1

http://stackoverflow.com/questions/2484919/how-do-i-split-a-string-by-strings-and-include-the-delimiters-using-net –

ответ

2

Соответствующие строки C может быть достигнуто с известным регулярным выражением:

"[^"\\]*(?:\\.[^"\\]*)*" 

См regex demo

Чтобы включить его в свой код, вам просто нужно добавить регулярное выражение в список разделителей , но вам нужно поместить его в качестве первой альтернативы в группе захвата.

var delimiters = new List<string> { " ", "(", ")", ">", "<", ",", ";"}; 
var line = "if(a>b) write(\"My new result\")"; 
var escaped_delimiters = new List<string>(); 
escaped_delimiters.Add(@"""[^""\\]*(?:\\.[^""\\]*)*"""); 
escaped_delimiters.AddRange(delimiters.Select(d => Regex.Escape(d)).ToList()); 
var pattern = "(" + String.Join("|", escaped_delimiters) + ")"; 
var result = Regex.Split(line, pattern).Where(x => !String.IsNullOrWhiteSpace(x)).ToList(); 

См IDEONE demo

Если вам не нужны никакие пустые элементы, используйте

List<string> result = Regex.Split(line, pattern).Where(x => !string.IsNullOrWhiteSpace(x)).ToList(); 

Результат будет

enter image description here

1

Я предлагаю вам выполнить сопоставление вместо разделения с помощью следующего регулярного выражения.

@"(?:""[^""]*""|\w|[^\w\s])+" 
Смежные вопросы