Това трябва да го направи:
string test = @"This|is|a|pip\|ed|test (this is a pip|ed test)";
string[] parts = Regex.Split(test, @"(?<!(?<!\\)*\\)\|");
Регулярният израз основно казва: разделяне на тръби, които не са предшествани от екраниращ знак. Не трябва да си приписвам заслуги за това обаче, просто отвлякох регулярния израз от тази публикация и го опрости.
РЕДАКТИРАНЕ
По отношение на производителността, в сравнение с метода за ръчно анализиране, предоставен в тази тема, открих, че това внедряване на Regex е 3 до 5 пъти по-бавно от изпълнението на Jonathon Wood, използвайки по-дългия тестов низ, предоставен от OP.
С това казано, ако не създадете или добавите думите към List<string>
и вместо това върнете void, методът на Jon идва около 5 пъти по-бърз от метода Regex.Split()
(0,01ms срещу 0,002ms) за чисто разделяне на низа. Ако добавите обратно разходите за управление и връщане на List<string>
, това беше около 3,6 пъти по-бързо (0,01ms срещу 0,00275ms), осреднено за няколко комплекта от милион итерации. Не използвах статичния Regex.Split() за този тест, вместо това създадох нов екземпляр на Regex с израза по-горе извън моя тестов цикъл и след това извиках неговия метод Split.
АКТУАЛИЗАЦИЯ
Използването на статичната функция Regex.Split() всъщност е много по-бързо от повторното използване на екземпляр на израза. С това внедряване използването на регулярен израз е само около 1,6 пъти по-бавно от изпълнението на Jon (0,0043ms срещу 0,00275ms)
Резултатите бяха същите при използване на разширения регулярен израз от публикацията, към която свързах.
person
Cᴏʀʏ
schedule
28.04.2011