如何根据内容拆分字符串?
How can I split a string depending on its content?
我正在尝试解析一个字符串并用一些定界符将其拆分,也包括定界符。
比如我想从字符串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"
(因为 space 是一个分隔符),但是 "it is positive"
.我该怎么做?
我建议您使用以下正则表达式进行匹配而不是拆分。
@"(?:""[^""]*""|\w|[^\w\s])+"
可以使用已知的正则表达式匹配 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();
如果不需要空元素,使用
List<string> result = Regex.Split(line, pattern).Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
结果会是
我正在尝试解析一个字符串并用一些定界符将其拆分,也包括定界符。
比如我想从字符串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"
(因为 space 是一个分隔符),但是 "it is positive"
.我该怎么做?
我建议您使用以下正则表达式进行匹配而不是拆分。
@"(?:""[^""]*""|\w|[^\w\s])+"
可以使用已知的正则表达式匹配 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();
如果不需要空元素,使用
List<string> result = Regex.Split(line, pattern).Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
结果会是