是否可以使用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:=“这是...}”。
我的意思是,如果出现在“ {”和“}”定界符之间,则应忽略“:”定界符。
答案 0 :(得分:1)
使用:
:(?!=)
因此您的代码应类似于:
string input = "One : Two:Three:=Four";
string pattern = @":(?!=)";
Regex reg = new Regex(pattern);
var parts = reg.Split(input);
对于问题的第二部分,您可以首先选择删除{}
之间的内容,然后将它们分开:
input = Regex.Replace(input, @"\{[^}]*\}", "");
答案 1 :(得分:0)
您可以使用:
:(?!=)(?![^{]*})
答案 2 :(得分:0)
您可以在(?<!
后面使用负向后视,在(?!
之前使用负向后视来断言冒号不在花括号之间。
为确保冒号后没有等号,您还可以使用负前瞻。
(?<!\{[^{}]*):(?!=)(?![^{}]*})
说明
(?<!
否定向后看左边的内容不是
\{[^{}]*
匹配{
,然后匹配0次以上,而不是{
或}
)
关闭非捕获组:(?!=)
如果后面不是等号则匹配冒号(?!
负向超前
[^{}]*}
匹配0次以上而不是{
或}
,然后匹配}
)
使用您的示例,如下所示:
string input = "One : Two:Three:=Four";
string pattern = @"(?<!\{[^{}]+):(?!=)(?![^{}]+})";
Regex reg = new Regex(pattern);
var parts = reg.Split(input);