输入字符串:
[Wsg-Fs]-A-A-A-Cgbs-Sg7-[Wwg+s-Fs]-A-A-Afk-Cgbs-Sg7
所需的输出是一个字符串数组:
[Wsg-Fs] A A A Cgbs Sg7 [Wwg+s-Fs] A A Afk Cgbs Sg7
如果我将输入字符串以-
分隔为分隔符,则方括号内的字符串也会被拆分。
如何拆分字符串,以便忽略方括号内的-
?
我可以找到一些类似的帖子试图忽略引号括起来的分隔符,但是我无法将这些解决方案应用到我的问题中。
任何建议都会非常有用。谢谢!
答案 0 :(得分:7)
假设没有嵌套的方括号,您可以使用以下内容仅匹配方括号外的-
个字符:
-(?![^\[]*\])
示例:http://regex101.com/r/sX5hZ2
这使用了一个负向前瞻,其逻辑是如果在任何左右方括号之前有一个右方括号,那么我们试图匹配的-
就在括号内。
答案 1 :(得分:2)
恢复这个古老的问题以提供另一种解决方案,因为当前只检查分裂-
后面没有]
,这并不能保证它被括在括号中。
\[[^\]]*\]|(-)
然后拆分第1组(参见demo右下方面板中的第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]-A-A-A-Cgbs-Sg7-[Wwg+s-Fs]-A-A-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
这是一个完整的online demo
参考