#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 [1…1]
fix exclusive
} ran;
slice "What were the steps of example 2?"
categorical [2…2]
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 строк, содержащих скобки, он также удаляет текст между скобками. Надеюсь, теперь я могу четко объяснить:-)