2015-05-20 2 views
2

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

Я использую C#, и я знаю, что методы Regex.Split и String.Split могут использоваться для достижения ожидаемых результатов. По какой-то причине мне нужно использовать регулярное выражение для соответствия требуемым полям, указав произвольный разделитель. Например, вот строка:

#DIV#This#DIV#is#DIV#"A "#DIV#string#DIV# 

Здесь #DIV# является ограничителем и собирается быть разделена как:

This 
is 
"A " 
string 

Как я могу использовать регулярные выражения, чтобы соответствовать эти значения?

Кстати, ведущий и ведомые #DIV# также можно пренебречь, например, ниже исходной строки также должна быть такой же результат с выше:

#DIV#This#DIV#is#DIV#"A "#DIV#string 

This#DIV#is#DIV#"A "#DIV#string#DIV# 

This#DIV#is#DIV#"A "#DIV#string 
+2

... вы попробуйте очевидное ' "yourstring" .split (» #DIV # ")'? Если да, то почему это не работает для вас? – nneonneo

+0

Это из-за моего общего дизайна приложения. Весь синтаксический анализ происходит из внешнего XML-файла, и мы применяем механизм регулярных выражений для извлечения необходимых полей. – jones

+0

Почему бы вам просто не применить «Regex.Split», а затем вытащить куски? – nneonneo

ответ

1

UPDATE:

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

var splits = Regex.Matches(strIn, @"(?<=#DIV#|^)(?:(?!#DIV#).)+?(?=$|#DIV#)"); 

См demo on regexstorm (возражаете \r? только для демонстрации в режиме многострочного, вам не нужно при использовании в реальной жизни)

ОРИГИНАЛЬНЫЙ ОТВЕТ

Вот еще один подход с использованием регулярные Split:

var strIn = "#DIV#This#DIV#is#DIV#\"A # \"#DIV#string#DIV#"; 
var splitText = strIn.Split(new[] {"#DIV#"}, StringSplitOptions.RemoveEmptyEntries); 

Или же, вы можете использовать регулярное выражение для соответствия полей вам нужно, и затем удалить пустые элементы с LINQ:

var spltsTxt2 = Regex.Matches(strIn, @"(?<=#DIV#|^).*?(?=#DIV#|$)").Cast<Match>().Where(p => !string.IsNullOrEmpty(p.Value)).Select(p => p.Value).ToList(); 

Выход:

enter image description hereenter image description here

+0

Большое спасибо. Это упрощенное выражение очень близко к тому, что мне нужно, кроме нулевого соответствия в начале и конце. Я знаю, что это очень просто применить LINQ для фильтрации этих нулевых совпадений, но для этого нужно добавить некоторые коды в универсальное приложение. Возможно ли отфильтровать нулевое соответствие только регулярным выражением вместо LINQ? – jones

+0

Ну, я думал, что это невозможно, но попробуйте 'Regex.Matches (strIn, @" (? <= # DIV # | ^) (?: (?! # DIV #).) +? (? = $ | #DIV #) ");'. он работает для всех случаев, которые у вас есть, пожалуйста, дайте мне знать, я обновлю свой ответ. –

+0

Отлично !! Он работает. Спасибо большое. – jones

0

Вы можете использовать следующее соответствие:

/#?DIV#?/g 

и заменить ' ' (пробел)

Но это даст задний и ведущие пробелы иногда .. которые могут быть бэр Oved с помощью String.Trim()

edit1: Если вы хотите, чтобы соответствовать значениям полей вы можете использовать следующее:

(?<=(#?DIV#?)|^)[^#]*?(?=(#?DIV#?)|$) 

См DEMO

Edit2: Более обобщенно регулярное выражение для сопоставления # в полях:

(?m)(?<=(^(?!#?DIV#)|(#?DIV#)))(.*?)(?=($|(#DIV#?))) 
+0

Нет, он соответствует только разделителям вместо значений полей. – jones

+0

Это закрытие, но оно соответствует полям: # Это, #is, # "A", #string. Этот шаблон не соответствует исходной строке без разделителя в начале и в конце. – jones

+0

Отлично! Теперь я могу получить все поля. Тем не менее, у меня также есть 2 дополнительных NULL-соответствия в начале и в конце, любой способ их удаления, кроме как только для настройки выражения? – jones

0
#DIV#|(.+?)(?=#DIV#|$) 

Попробуйте это. Захватите захваты или группы. Смотрите демо.

https://www.regex101.com/r/fJ6cR4/21

+0

Спасибо! Я использую регулярное выражение .Net, и оно соответствует полям и разделителю «# DIV #». Любой способ удалить соответствующий разделитель? – jones

+0

@jones use 'match.groups()' – vks

+0

Для регулярного выражения .net существует 9 совпадений и 2 группы для каждого совпадения (один для сопоставленного шаблона, другой - пустая строка). Есть идеи? – jones

Смежные вопросы