需要修复perl regex以处理多种情况

时间:2020-01-09 05:46:07

标签: regex perl

我正在尝试使用正则表达式处理字符串的某些情况: (.*note(?:'|")?\s*=>\s*)("|')?(.*?)\2(.*)

字符串:

  • note =>“便笺在这里”,
  • note =>“注释在这里”,
  • note => $ note,
  • note =>“ $ note”,
  • note =>'$ note',
  • note =>'$ note'
  • note => $ note。 $ note2(可以花更长的时间,将其视为perl哈希的键值)
  • #note =>'$ note',

开始/结束/之间可以有多个空格。我需要捕获"(或'),$note,或note_section之后剩下的所有内容。如果此行是注释,则开头可以有#,因此,我在开头包含了.*
在情况3中,鉴于正则表达式失败,因为\2为null。

编辑: 要求是我正在读取文件,并用一些标记为NOTETAG的标签替换note的值,并且周围的所有其他内容保持不变,包括逗号和空格。为此,

  • 我们需要捕获从开始到开始编写值的所有内容
  • 我们也应该捕获逗号,以便我可以准确地写回它
  • 我们需要记录笔记的价值
  • 我们也应该在音符值之后捕获事物。

例如note => "kamal" ,将成为note => "NOTETAG" ,(请注意,我们从上次开始没有吃过,

2 个答案:

答案 0 :(得分:3)

s{
   \b
   note
   \s*
   =>
   \s*
   \K
   (?: (.*)
   |   '[^']*'
   |   "[^"]*"
   )
}{
   defined($1)
   ?  $1 =~ s{\$note\b}{"NOTETAG"}gr
   : '"NOTETAG"'
}exg;

答案 1 :(得分:1)

您可以尝试(note\s*=>\s*(?:"|')?)[^'",]+

说明:

(...)-捕获组

note-完全匹配note

\s*-匹配零个或多个空格

=>-完全匹配=>

(?:..)-非捕获组

"|'-交替:匹配'"

?-匹配前面的模式零或一次

[^'",]+-否定的字符类-匹配一个或多个除+'" ,运算符) >

Demo

作为替代使用\1NOTETAG,其中\1表示第一个捕获组