4

输入字符串:

[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

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

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

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

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

4

2 回答 2

9

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

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

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

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

于 2012-08-30T20:10:42.677 回答
2

复活这个古老的问题以提供另一种解决方案,因为当前的问题只检查分裂-后没有 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]-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

这是一个完整的在线演示

参考

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

如何匹配模式,除非...

于 2014-05-14T23:58:26.060 回答