Это должно сделать это:
string test = @"This|is|a|pip\|ed|test (this is a pip|ed test)";
string[] parts = Regex.Split(test, @"(?<!(?<!\\)*\\)\|");
Регулярное выражение в основном говорит: разделить на каналы, которым не предшествует escape-символ. Однако я не должен брать на себя ответственность за это, я просто взломал регулярное выражение из этого поста и упростил его.
ИЗМЕНИТЬ
С точки зрения производительности, по сравнению с методом ручного синтаксического анализа, представленным в этом потоке, я обнаружил, что эта реализация Regex в 3-5 раз медленнее, чем реализация Джонатона Вуда с использованием более длинной тестовой строки, предоставленной OP.
С учетом сказанного, если вы не создадите экземпляр или не добавите слова в List<string>
и вместо этого вернете void, метод Джона будет выполняться примерно в 5 раз быстрее, чем метод Regex.Split()
(0,01 мс против 0,002 мс) для простого разделения строки. Если вы добавите накладные расходы на управление и возврат List<string>
, это будет примерно в 3,6 раза быстрее (0,01 мс против 0,00275 мс), в среднем за несколько наборов из миллиона итераций. Я не использовал статический Regex.Split() для этого теста, вместо этого я создал новый экземпляр Regex с приведенным выше выражением вне моего тестового цикла, а затем вызвал его метод Split.
ОБНОВЛЕНИЕ
Использование статической функции Regex.Split() на самом деле намного быстрее, чем повторное использование экземпляра выражения. В этой реализации использование регулярных выражений всего примерно в 1,6 раза медленнее, чем реализация Джона (0,0043 мс против 0,00275 мс).
Результаты были такими же, используя расширенное регулярное выражение из поста, на который я ссылался.
person
Cᴏʀʏ
schedule
28.04.2011