【问题标题】:Need to fix the perl regex to handle multiple cases需要修复 perl 正则表达式以处理多种情况
【发布时间】:2020-01-10 00:28:26
【问题描述】:

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

字符串:

  • note => “这里是注释”,
  • note => '注意在这里',
  • 注 => $注,
  • note => "$note",
  • note => '$note',
  • note => '$note'
  • 注 => $注。 $note2(可以更长,认为它是 perl 哈希的键值)
  • # note => '$note',

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

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

  • 我们需要从头开始捕获所有内容,直到我们开始写入值
  • 我们也应该捕获引号,这样我就可以准确地写回来
  • 我们需要捕捉笔记的价值
  • 我们也应该捕捉音符值之后的东西。

例如note => "kamal" , 将变为 note => "NOTETAG" ,(注意我们没有吃掉上次的 ,

【问题讨论】:

    标签: regex perl


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

    【讨论】:

    • 谢谢,通过在前面添加 (.*) 进行了一些修改以处理注释 (#)。同样在最后,将, 移至单独的捕获组:-)
    • 不,不需要前导.*。所有这一切都会让事情减少很多(除非你很幸运,并且一些优化可以让你摆脱这种情况)。
    • 我确实需要那个。我需要存储所有这些东西(包括确切的空格数)并写入。这不会很贵,因为在我的文件中我的此类行数有限,实际上它是哈希中的键值对。
    • 这让事情变得更糟。当找不到note 时,它会减慢速度。
    • 更新后仍然不需要.*。 /// 更新答案以匹配新问题
    【解决方案2】:

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

    解释:

    (...) - 捕获组

    note - 匹配 note 字面意思

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

    => - 匹配 => 字面意思

    (?:..) - 非捕获组

    "|' - 替代:匹配'"

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

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

    Demo

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

    【讨论】:

    • 谢谢,但是,这仅适用于我们仅进行替换并且以后不需要它的情况。我们需要捕获刚刚用 NOTETAG 替换的值,此外,如果我们的值像 note => "9 'o clock",
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多