Regex для сопоставления символа, но не когда он заключен в квадратную скобку

Строка ввода:

[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

Если я разделил входную строку с - как разделитель, строка в квадратных скобках также будет разделена.

Как разбить строку так, чтобы - в квадратной скобке нужно было игнорировать?

Я мог бы найти похожие записи, пытающиеся игнорировать разделитель, заключенный в кавычки, однако я не смог применить это решение к моей проблеме.

Любое предложение будет действительно полезно. Спасибо!

Ответ 1

Предполагая, что нет вложенных квадратных скобок, вы можете использовать следующее, чтобы соответствовать только символам -, которые находятся вне квадратных скобок:

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

Пример: http://regex101.com/r/sX5hZ2

В этом случае используется отрицательный lookahead с логикой, что если перед квадратными скобками открытия есть закрывающая квадратная скобка, то -, который мы пытались сопоставить, находится внутри скобок.

Ответ 2

Воскрешая этот древний вопрос, чтобы предложить другое решение, поскольку текущий только проверяет, что за - не следует ], что не гарантирует, что оно заключено в скобки.

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

Затем разбиение на группу 1 (см. группу 1 в нижней правой панели demo)

Чтобы разбить на группу 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

Как сопоставить шаблон, если...