C# 按分隔符拆分字符串,并跳过分隔符后跟某个字符的部分

C# 按分隔符拆分字符串,并跳过分隔符后跟某个字符的部分,c#,.net,regex,split,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个部分:“1”、“2”、“3”和“=4” 我试图修改示例,如下所示: string i

是否可以使用Regex.Split()以分隔符分隔字符串,但前提是分隔符后面没有字符。 例如,我想用“:”分隔符拆分字符串,但忽略“:=”分隔符。此代码:

string input = "One : Two:Three:=Four";
string pattern = @":";
Regex reg = new Regex(pattern);
var parts = reg.Split(input):
返回4个部分:“1”、“2”、“3”和“=4”

我试图修改示例,如下所示:

string input = "One : Two:Three:=Four";
string pattern = @":[^=]";
Regex reg = new Regex(pattern);
var parts = reg.Split(input):
现在我得到了三个部分:“一”,“二”和“三:=四”。为了正确地开始第三部分,必须改变模式中的内容,如:“三:=四”

用一个附加的开始/结束定界符定义来扩展上面的示例,该定义还禁用由定义的定界符进行的拆分。例如:

string input = "One : Two:Three:=Four {Comment:String:="This is a comment";AddditionalInfo:String:="This is some additional info";}";
结果应该包含以下3个部分:“一”、“二”和“三:=4{Comment:String:=“This is…}”

如果“{”和“}”分隔符之间存在“:”分隔符,则应忽略它。

使用:

:(?!=)
因此,您的代码应该如下所示:

string input = "One : Two:Three:=Four";
string pattern = @":(?!=)";
Regex reg = new Regex(pattern);
var parts = reg.Split(input);
对于问题的第二部分,您可以首先选择删除
{}
之间的部分,然后拆分它们:

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

您可以使用以下工具进行拆分:

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

您可以使用负向后看
(?)和负向前看
(?!
来断言冒号不在花括号之间

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

解释

  • (?用于检查左侧内容是否正确的反向查找
    
    • \{[^{}]*
      匹配
      {
      然后匹配0+次非
      {
      }
  • 关闭非捕获组
  • :(?!=)
    如果后面的不是等号,请匹配冒号
  • (?!
    负前瞻
    • [^{}]*}
      匹配0+次不
      {
      }
      后跟匹配
      }
以您的示例为例,这将类似于:

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

字符串模式=@“(?
where delimiter后跟一些字符
你知道
空格
是一个字符。@RickyTad请检查我的答案和演示。请看我编辑的答案。请注意,对问题进行重大更改会使以前正确的答案不正确,因此,如果问题中有错误,请编辑问题,不要更改或者扩展它,你可以问另一个问题。问题的第一部分已经解决了,谢谢。关于问题的第二部分:{}之间的字符串以后必须单独解析,因此无法直接删除。如何在删除之前先提取此部分?好吧,您不必真正删除它,可以将更改后的字符串放入另一个变量中,或者只需:
reg.Split(Regex.Replace(input,@“\{[^}]*\},”).
,您的输入值不会更改,但它会在拆分字符串中的
{}
部分更改,请注意,在一个正则表达式中可以同时执行这两个操作(我不知道如何执行)但是,编写一个非常复杂的正则表达式并不是一件好事,它需要花费大量的时间来执行,只是为了避免在两行中执行。谢谢您回答我问题的第二部分。