按分隔符拆分字符串并跳过分隔符后跟某些字符的部分
Posted
技术标签:
【中文标题】按分隔符拆分字符串并跳过分隔符后跟某些字符的部分【英文标题】: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 请检查我的答案和演示。
查看我编辑的答案。请注意,对问题进行重大更改会使之前的正确答案不正确,因此,如果您的问题中有错误,请编辑问题,不要更改或扩展它,您可以为此提出另一个问题。
【参考方案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#
【讨论】:
以上是关于按分隔符拆分字符串并跳过分隔符后跟某些字符的部分的主要内容,如果未能解决你的问题,请参考以下文章