Регулярное выражение для определенного шаблона, содержащего многострочный текст

#regex

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

Вопрос:

Нужна помощь в создании регулярных выражений для приведенных ниже —

Входные данные —

 Steps_taken "" loop
{
_1 "1st"
[
Sub cat = "_1,_2,_3,_4,_5,_6,_7"
],
_2 "2nd"
[
Sub cat = "_1,_2,_3,_4,_5,_6,_7,_98"
]
} fields -
(
slice "What were the steps you have taken from the time when the symptom appeared to when the pain         was addressed?

categorical [1…1]

fix exclusive
} ran;

) expand grid;
 

Выходной сигнал —

срез «Какие шаги вы предприняли с момента появления симптома до того, как была устранена боль?

 categorical [1…1]

fix exclusive
} ran;
 

В текстовом файле может быть несколько экземпляров такого шаблона.

Таким образом, мне нужно удалить здесь 2 части —

 From the beginning of the line containing keyword 'loop' till keyword 'fields -'
Opening bracket (which will always be there below the line containing 'fields -') and closing bracket (which will always contain keyword 'grid;')
 

Ответ №1:

Ваше краткое изложение того, что должно произойти, и ваш пример вывода (для данного ввода) не совпадают. Я предполагаю, что ваше резюме — это то, что вы хотите.

Вы можете использовать регулярное выражение с заменой:

 /[^nr] loop[sS]*?fields[ -nr(]*([sS]*?)) expand grid;[nr] /g
 

Объяснение:

  • [^nr] loop — сканирование по loop строке
  • [sS]*?fields — не жадно сканируйте что-либо, пока fields
  • [ -nr(]* — сканирование дополнительных символов, которые нам не нужны
  • ([sS]*?) — не жадно просматривайте и захватывайте все, что угодно…
  • ) expand grid; — … до ) expand grid;
  • [nr] — сканирование по новым строкам
  • g флаг предназначен для глобального, например. сопоставлять несколько шаблонов, подобных этому
  • для замены обратитесь к группе захвата с $ помощью или 1 , в зависимости от вашего языка

Позвольте мне использовать JavaScript с двумя повторяющимися шаблонами для демонстрации здесь, в stackoverlow, вы можете легко перевести это на свой язык:

 const input = `Steps_taken "" loop
{
_1 "1st"
[
Sub cat = "_1,_2,_3,_4,_5,_6,_7"
],
_2 "2nd"
[
Sub cat = "_1,_2,_3,_4,_5,_6,_7,_98"
]
} fields -
(
slice "What were the steps of example 1?"
categorical [1…1]
fix exclusive
} ran;
) expand grid;
Steps_taken "" loop
{
_1 "1st"
[
Sub cat = "_1,_2,_3,_4,_5,_6,_7"
],
_2 "2nd"
[
Sub cat = "_1,_2,_3,_4,_5,_6,_7,_98"
]
} fields -
(
slice "What were the steps of example 2?"
categorical [2…2]
fix exclusive
} ran;
) expand grid;
`;

const regex = /[^nr] loop[sS]*?fields[ -nr(]*([sS]*?)) expand grid;[nr] /g;
var result = input.replace(regex, '$1');
console.log('result:n'   result); 

Вывод:

 result:
slice "What were the steps of example 1?"
categorical [11]
fix exclusive
} ran;
slice "What were the steps of example 2?"
categorical [22]
fix exclusive
} ran;
 

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

1. Спасибо тебе за ответ, Питер. Я только что понял, что при публикации похоже, что часть моего контента была неуместна, отсюда и путаница. По сути, мне нужно удалить все содержимое с начала строки, содержащей ключевое слово ‘loop’, до полей — и скобки ‘()’, которые начинаются со строки ниже строки, содержащей ключевое слово ‘fields -‘, и конечная точка закрытия скобки всегда будет содержать ключевое слово ‘сетка;’ (Текст между скобками должен быть там как есть).

2. Если я что-то не пропустил, вот как работает мое регулярное выражение.

3. Огромное спасибо за предоставление регулярного выражения для меня. Просто еще один запрос здесь — для более поздней части моего регулярного выражения, если я хотел бы выбрать строку, начинающуюся с ключевого слова ‘grid;’ вместо ‘) развернуть сетку;’ Я могу поместить ‘[^ n r] grid;’ — правильно ли это понимание?

4. По вашему новому вопросу мне не ясно, где находится закрывающая скобка в предыдущей строке? Не существует? Если оно не существует, ваше регулярное выражение /[^nr] loop[sS]*?fields[ -nr(]*([sS]*?)[nr] grid;[nr] /g

5. [^ n r] цикл [s S]*?поля[ -n r(]*([s S]*?)) развернуть сетку;[n r] — С приведенным выше шаблоном он работает частично-После удаления до ‘fields -‘ следует удалить только еще 2 строки — a) Начало скобки ‘(‘ которая всегда будет следующей строкой ключевого слова ‘fields -‘ b) Строка, содержащая закрывающую скобку ‘)’, которая всегда будет содержать ключевое слово ‘grid;’ С приведенным выше регулярным выражением, он работает до удаления части ‘fields -‘, но после этого вместо удаления только 2 строк, содержащих скобки, он также удаляет текст между скобками. Надеюсь, теперь я могу четко объяснить:-)