Опитвам се да разредя низ и да я разделя от някои разделители, включително и разделителите.
Например от низа 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])+"