【问题标题】:How can I split a string depending on its content?如何根据内容拆分字符串?
【发布时间】:2015-10-22 09:56:14
【问题描述】:

我正在尝试解析一个字符串并用一些分隔符分割它,也包括分隔符。

比如从字符串if(a>b) write(a);我想得到if,(,a,>,b,),write,(,@98764 @,),;

这是我尝试过的:

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

它可以工作,但在某些情况下会失败。如果我有字符串if(a&gt;0) write("it is positive");,我不想得到"it,is,positive"(因为空格是分隔符),而是"it is positive"。我该怎么做?

【问题讨论】:

标签: c# regex string split delimiter


【解决方案1】:

可以使用已知的正则表达式来匹配 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();

结果是

【讨论】:

    【解决方案2】:

    我建议您使用以下正则表达式进行匹配而不是拆分。

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

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 2018-05-12
      • 2021-11-07
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 2020-04-18
      相关资源
      最近更新 更多