Регулярное выражение для исключения части строки при разделении

#c# #regex

#c# #регулярное выражение

Вопрос:

Несколько недель назад я задавал аналогичный вопрос о том, как разделить строку на основе определенной подстроки. Однако сейчас я хочу сделать что-то немного другое. У меня есть строка, которая выглядит так (извините за форматирование):

Что я хочу сделать, так это разделить эту строку на все последовательности перевода строки r n. Однако я не хочу этого делать, если после одной из строк PA41 есть PA42. Я хочу, чтобы строка PA41 и следующая за ней строка PA42 находились на одной строке. Я пытался использовать несколько выражений регулярных выражений, но безрезультатно. Результат, который я ищу, в идеале будет выглядеть следующим образом:

Это регулярное выражение, которое я сейчас использую, но оно не совсем соответствует тому, что я ищу.

 string[] p = Regex.Split(parameterList[selectedIndex], @"[rn] (?=PA41)");
 

Если вам нужны какие-либо разъяснения, пожалуйста, не стесняйтесь спрашивать.

Ответ №1:

Вы пытаетесь заглянуть в будущее с положительным прогнозом, вам нужен отрицательный. (Положительный гарантирует, что шаблон действительно выполняется, тогда как отрицательный гарантирует, что он не выполняется.)

 (\r\n)(?!PA42)
 

Работает для меня.

Комментарии:

1. Спасибо. По какой-то причине, когда я использую это выражение, оно фактически не расщепляется, если я не использую @»(r n)(?!PA42)». Однако тогда он также разбивает r n на отдельную строку вместо того, чтобы сохранять их в конце конца строки PA ##.

2. @almostProgramming: являются ли символы » r n» буквальным символом ` then an n ` или r ? или это возврат каретки и перевод строки? Это будет иметь большое значение в схеме, но я не знаю, показываете ли вы им форт ради вопроса, или это персонажи.

3. На самом деле это возврат каретки и новые строки. Извините за это, я должен был прояснить это в вопросе.

4. Затем вы можете использовать класс [rn] или использовать (r|n) в шаблоне, если хотите, чтобы регулярное выражение означало эти конкретные символы, а не их экранированные противоположные части.

5. Это сделало свое дело. Большое вам спасибо. Мне нужно вложить деньги в книгу регулярных выражений, это точно.

Ответ №2:

 string[] splitArray = Regex.Split(subjectString, @"\r\n(?!PA42)");
 

Это должно сработать. Он использует отрицательное предварительное утверждение, чтобы гарантировать, что за последовательностью r n не следует PA42.

Объяснение :

 @"
\         # Match the character “” literally
r          # Match the character “r” literally
\         # Match the character “” literally
n          # Match the character “n” literally
(?!        # Assert that it is impossible to match the regex below starting at this position (negative lookahead)
   PA42       # Match the characters “PA42” literally
)
"
 

Комментарии:

1. Спасибо вам за быстрый ответ.

2. @almostProgramming Никаких проблем. Почему вы не приняли это, хотя я не могу понять 🙂

3. @almostProgramming Я был первым! 🙂 Но это не имеет значения. Рад, что ваша проблема решена так или иначе.