Необходимо исправить регулярное выражение perl для обработки нескольких случаев - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь обработать некоторые случаи строк с помощью регулярного выражения: (.*note(?:'|")?\s*=>\s*)("|')?(.*?)\2(.*)

Строки:

  • note => «примечание идет сюда»,
  • note => «примечание идет сюда»,
  • note => $ note,
  • note => «$ note»,
  • note => '$ note' ,
  • note => '$ note'
  • note => $ note. $ note2 (может go больше, считайте его значением ключа perl га sh)
  • # note => '$ note',

Можно быть несколько пробелов в начале / конце / между ними. Мне нужно захватить " (или '), $note, , или все, что осталось после note_section. Может быть # в начале, если эта строка является комментарием, поэтому я включил .* в начале.
Данное регулярное выражение не работает в случае 3, поскольку \2 равно нулю.

Редактировать: Требуется, чтобы я читал файл и заменял значение примечания на некоторые теги говорят NOTETAG, и все остальное вокруг остается тем же, включая кавычки и пробелы. Для этого

  • нам нужно захватить все с начала до начала записи значения
  • Мы должны также захватить кавычки, чтобы я мог записать их точно
  • Нам нужно захватить значение примечания
  • Мы должны захватить вещи и после значения примечания.

Например, note => "kamal" , станет note => "NOTETAG" , (обратите внимание, мы не ел , с последнего)

Ответы [ 2 ]

3 голосов
/ 09 января 2020
s{
   \b
   note
   \s*
   =>
   \s*
   \K
   (?: (.*)
   |   '[^']*'
   |   "[^"]*"
   )
}{
   defined($1)
   ?  $1 =~ s{\$note\b}{"NOTETAG"}gr
   : '"NOTETAG"'
}exg;
1 голос
/ 09 января 2020

Юо может попробовать (note\s*=>\s*(?:"|')?)[^'",]+

Объяснение:

(...) - группа захвата

note - совпадение note буквально

\s* - совпадение с нулем или более пробелов

=> - совпадение => буквально

(?:..) - группа без захвата

"|' - чередование : соответствует либо ' или "

? - совпадение с нулем или предыдущим шаблоном

[^'",]+ - отрицательный класс символов - сопоставление одного или нескольких символов (из-за + оператор), кроме ', ", ,

Демо

В качестве замены используйте \1NOTETAG, где \1 означает первый группа захвата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...