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
Как сопоставить шаблон, если...