Input string:
[Wsg-Fs]-A-A-A-Cgbs-Sg7-[Wwg+s-Fs]-A-A-Afk-Cgbs-Sg7
Desired output is a string array:
[Wsg-Fs] A A A Cgbs Sg7
Assuming there are no nested square brackets, you can use the following to only match -
characters that are outside of square brackets:
-(?![^\[]*\])
Example: http://regex101.com/r/sX5hZ2
This uses a negative lookahead, with the logic that if there is a closing square bracket before any opening square brackets, then the -
that we tried to match is inside of brackets.
Resurrecting this ancient question to offer another solution, since the current one only checks that a splitting -
is not followed by a ]
, which does not guarantee that it is enclosed in brackets.
\[[^\]]*\]|(-)
Then splitting on Group 1 (see the Group 1 captures in the bottom right panel of the demo)
To split on Group 1, we first replace Group 1 with something distinctive, such as SPLIT_HERE
, then we split on 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
Here's a full working online demo
Reference
How to match pattern except in situations s1, s2, s3
How to match a pattern unless...