#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 Я был первым! 🙂 Но это не имеет значения. Рад, что ваша проблема решена так или иначе.