Судя по вашей истории публикаций, я думаю, вы говорите о регулярных выражениях в C # (.NET). В этом случае это должно работать:
Regex.Split(target, @"(?<!\[)/");
Предполагается, что каждому неделимитору /
непосредственно предшествует левая квадратная скобка, как в ваших данных выборки.
Вы всегда должны указывать, с каким регулярным выражением вы работаете. Эта техника, например, требует аромата, который поддерживает внешний вид. На мой взгляд, это Perl, PHP, Python и Java, но не JavaScript.
РЕДАКТИРОВАТЬ: Вот демонстрация на Java:
public class Test
{
public static void main(String[] args)
{
String str = "/div1/div2[/div3[/div4]]/div5/div6[/div7]";
String[] parts = str.split("(?<!\\[)/");
for (String s : parts)
{
System.out.println(s);
}
}
}
выход:
div1
div2[/div3[/div4]]
div5
div6[/div7]
Конечно, я полагаюсь на некоторые упрощающие предположения здесь. Надеюсь, вы дадите мне знать, если какое-то из моих предположений будет неверным, Майк. :)
РЕДАКТИРОВАТЬ: Все еще ожидая решения от Майка о предположениях, но Крис Латс поднял хорошую точку в своем комментарии к 280Z28. На корневом уровне в примере строки есть два места, где вы видите два смежных токена /divN
, но на каждом другом уровне токены всегда изолированы друг от друга квадратными скобками. Мое решение, как и у 280Z28, предполагает, что это всегда будет правдой, но что если данные выглядят так?
/div1/div2[/div3/div8[/div4]/div9]/div5/div6[/div7]
Теперь у нас есть два места, где косая черта без разделителя равна , а не с предшествующей левой квадратной скобкой, но основная идея такова. Начиная с любой точки корневого уровня, если вы сканируете вперед в поисках квадратных скобок, первой, которую вы найдете, всегда будет левая (или открывающая) скобка. Если вы отсканируете назад, вы всегда сначала найдете правую (или закрывающую) скобку. Если оба эти условия не соответствуют действительности, вы не находитесь на корневом уровне. Переводя это на lookarounds, вы получаете это:
/(?![^\[\]]*\])(?<!\[[^\[\]]*)
Я знаю, что это становится довольно мрачно, но я возьму на себя эту чертову рекурсию в любой день недели. ;) Еще одна приятная вещь - вам не нужно ничего знать о токенах, кроме того, что они начинаются с косой черты и не содержат квадратных скобок. Кстати, это регулярное выражение содержит вид сзади, который может соответствовать любому количеству символов; список вариантов регулярных выражений, поддерживающих , которые действительно очень короткие, но .NET может это сделать.