用于匹配字符的正则表达式,但不包括在方括号中

输入字符串:

[Wsg-Fs]-AAA-Cgbs-Sg7-[Wwg+s-Fs]-AA-Afk-Cgbs-Sg7 

期望的输出是一个字符串数组:

 [Wsg-Fs] AAA Cgbs Sg7 [Wwg+s-Fs] AA Afk Cgbs Sg7 

如果我用-作为分隔符拆分输入字符串,方括号内的字符串也会被拆分。

如何拆分字符串,以便在方括号内忽略?

我可以找到一些类似的post试图忽略用引号括起来的分隔符,但是我无法将这些解决方案应用于我的问题。

任何建议都会非常有用。 谢谢!

假设没有嵌套的方括号,您可以使用以下内容仅匹配-方括号外的字符:

 -(?![^\[]*\]) 

示例: http : //regex101.com/r/sX5hZ2

这使用了一个负向前瞻,其逻辑是如果在任何开口方括号之前有一个右方括号,那么我们试图匹配的是在括号内。

恢复这个古老的问题以提供另一种解决方案,因为当前只检查分裂-后面没有a,这不能保证它被括在括号中。

 \[[^\]]*\]|(-) 

然后拆分第1组(参见演示组右下方面板中的第1组捕获)

要拆分第1组,我们首先用不同的东西替换第1组,例如SPLIT_HERE ,然后我们拆分SPLIT_HERE

 using System; using System.Text.RegularExpressions; using System.Collections.Specialized; class Program { static void Main() { string s1 = @"[Wsg-Fs]-AAA-Cgbs-Sg7-[Wwg+s-Fs]-AA-Afk-Cgbs-Sg7"; var myRegex = new Regex(@"\[[^\]]*\]|(-)"); var group1Caps = new StringCollection(); string replaced = myRegex.Replace(s1, delegate(Match m) { if (m.Groups[1].Value == "") return m.Groups[0].Value; else return "SPLIT_HERE"; }); string[] splits = Regex.Split(replaced,"SPLIT_HERE"); foreach (string split in splits) Console.WriteLine(split); Console.WriteLine("\nPress Any Key to Exit."); Console.ReadKey(); } // END Main } // END Program 

这是一个完整的在线演示

参考

如何匹配模式除了情况s1,s2,s3

除非……如何匹配模式