/ / Как мога да разделям низ в зависимост от съдържанието му? - c #, regex, низ, разделяне, разделител

Как мога да разделям низ в зависимост от съдържанието му? - c #, regex, низ, разделяне, разделител

Опитвам се да разредя низ и да я разделя от някои разделители, включително и разделителите.

Например от низа 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", Как мога да направя това?

Отговори:

2 за отговор № 1

Съответстващите струни C могат да бъдат постигнати с известен регекс:

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

виждам регекс демо

За да го включите в кода си, трябва просто да добавите регекс към списъка с разделители, но трябва да го поставите като първата алтернатива в групата за улавяне.

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 демонстрация

Ако нямате нужда от празни елементи, използвайте

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

Резултатът ще бъде

въведете описанието на изображението тук


1 за отговор № 2

Предлагам ви да направите съвпадение вместо разделяне, като използвате по-долу регекс.

@"(?:""[^""]*""|w|[^ws])+"