【问题标题】:Split string by delimiter and skip parts where delimiter followed by some character按分隔符拆分字符串并跳过分隔符后跟某些字符的部分
【发布时间】:2019-04-04 22:36:20
【问题描述】:

是否可以使用 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";}";

结果应包含以下 3 个部分:“One”、“Two”和“Three:=Four {Comment:String:="This is ...}”。

我的意思是如果在“{”和“}”分隔符之间存在“:”分隔符,则应该忽略它。

【问题讨论】:

  • where delimiter followed by some character 你知道space 太过分了。
  • @RickyTad 请检查我的答案和演示。
  • 查看我编辑的答案。请注意,对问题进行重大更改会使之前的正确答案不正确,因此,如果您的问题中有错误,请编辑问题,不要更改或扩展它,您可以为此提出另一个问题。

标签: c# .net regex split


【解决方案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

【讨论】:

  • 第一部分问题解决了,谢谢。关于问题的第二部分: {} 之间的字符串稍后必须单独解析,因此不能直接删除。这部分如何在被移除之前先被提取?
  • 好吧,您不必真正删除它,可以将更改后的字符串放在另一个变量中,或者只是:reg.Split(Regex.Replace(input, @"\{[^}]*\}", "")).,您的输入值不会改变,但它是{} 中的一部分在拆分字符串中,请注意,可以在一个正则表达式中同时执行这两个操作(我不知道如何),但是编写一个非常复杂的正则表达式并不好,它需要大量时间来执行只是为了避免这样做两行。
【解决方案2】:

您可以使用以下方式拆分:

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

【讨论】:

  • 感谢您回答我问题的第二部分。
【解决方案3】:

您可以使用否定的lookbehind (?<! 和否定的lookahead (?! 来断言冒号不在大括号之间。

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

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

Regex demo

说明

  • (?<! 负向后检查左边的内容是不是
    • \{[^{}]* 匹配 { 后跟匹配 0+ 次而不是 { 或 }
  • )关闭非捕获组
  • :(?!=)如果后面不是等号,则匹配冒号
  • (?! 负前瞻
    • [^{}]*} 匹配 0+ 次而不是 { 或 } 后跟匹配 }
  • )

使用您的示例,看起来像:

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

Demo C#

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多