按定界符分割字符串,并跳过定界符后跟某些字符的部分

时间:2018-10-31 17:14:24

标签: c# .net regex split

是否可以使用Regex.Split()通过定界符来分隔字符串,但前提是定界符后面没有某些字符。 例如,我想用“:”分隔符分割字符串,但是忽略“:=”分隔符。这段代码:

string input = "One : Two:Three:=Four";
string pattern = @":";
Regex reg = new Regex(pattern);
var parts = reg.Split(input):

返回4个部分:“一个”,“两个”,“三个”和“ =四个”。

我试图这样修改示例:

string input = "One : Two:Three:=Four";
string pattern = @":[^=]";
Regex reg = new Regex(pattern);
var parts = reg.Split(input):

现在我得到3个部分:“一个”,“两个”和“三:=四个”。必须更改模式中的内容才能正确地开始第三部分,例如:“ Three:= Four”。

如何使用附加的开始/结束定界符定义扩展上述示例,该定义也将禁用已定义定界符的拆分。例如:

string input = "One : Two:Three:=Four {Comment:String:="This is a comment";AddditionalInfo:String:="This is some additional info";}";

结果应包含以下三个部分:“一个”,“两个”和“三个:=四{Comment:String:=“这是...}”。

我的意思是,如果出现在“ {”和“}”定界符之间,则应忽略“:”定界符。

3 个答案:

答案 0 :(得分:1)

使用:

:(?!=)

因此您的代码应类似于:

string input = "One : Two:Three:=Four";
string pattern = @":(?!=)";
Regex reg = new Regex(pattern);
var parts = reg.Split(input);

对于问题的第二部分,您可以首先选择删除{}之间的内容,然后将它们分开:

input = Regex.Replace(input, @"\{[^}]*\}", "");

Live Demo

答案 1 :(得分:0)

您可以使用:

:(?!=)(?![^{]*})

答案 2 :(得分:0)

您可以在(?<!后面使用负向后视,在(?!之前使用负向后视来断言冒号不在花括号之间。

为确保冒号后没有等号,您还可以使用负前瞻。

(?<!\{[^{}]*):(?!=)(?![^{}]*})

Regex demo

说明

  • (?<!否定向后看左边的内容不是
    • \{[^{}]*匹配{,然后匹配0次以上,而不是{}
  • )关闭非捕获组
  • :(?!=)如果后面不是等号则匹配冒号
  • (?!负向超前
    • [^{}]*}匹配0次以上而不是{},然后匹配}
  • )

使用您的示例,如下所示:

string input = "One : Two:Three:=Four";
string pattern = @"(?<!\{[^{}]+):(?!=)(?![^{}]+})";
Regex reg = new Regex(pattern);
var parts = reg.Split(input);

Demo C#