我想在一段代码的末尾得到一个或多个 ->func(xxx,xxx)

他们可能是这样的:

any code any code ->func(xxx)

或者
any code any code
->func()

或者
any code any code
-funcA()->funcB(xxx)

或者
any code any code
->funcA()
->funcB(xxx)

或混合它们:
o.start_time = obj.s;
o.repair_type -> obj.r;
o.limit -> obj.l;->god("('\"\"')") ->fox(,'->')
->egg()->dog(,'c')
->cat(,'b')-> banana(,'a"\'\(\)\'->"()')  ->  apple(,'a')

在这段代码中,我想:
  • 计划 A
  • 获取子串 apple(,'a')
  • 删除 -> apple(,'a')
  • 获取子串 banana(,'a"\'\(\)\'->"()')
  • 删除 -> banana(,'a"\'\(\)\'->"()')
  • 获取子串 cat(,'b')
  • 删除 ->cat(,'b')
  • 获取子串 dog(,'c')
  • 删除 ->dog(,'c')
  • 获取 egg()
  • 删除 ->egg()
  • 获取 fox(,'->')
  • 删除 ->fox(,'->')
  • 获取 god("('\"\"')")god("('\"\"')")
  • 删除 ->god("('\"\"')")
  • 结束
  • 计划 B:
  • 获取和删除 ->cat(,'b')-> banana(,'a"\'\(\)\'->"()') -> apple(,'a')
  • 获取子串 apple(,'a')
  • 删除 -> apple(,'a')
  • 获取子串 banana(,'a"\'\(\)\'->"()')
  • 删除 -> banana(,'a"\'\(\)\'->"()')
  • 获取子串 cat(,'b')
  • 删除 ->cat(,'b')
  • 获取和删除 ->egg()->dog(,'c')
  • 获取子串 dog(,'c')
  • 删除 ->dog(,'c')
  • 获取 egg()
  • 删除 ->egg()
  • 获取和删除 ->god("('\"\"')") ->fox(,'->')
  • 获取 fox(,'->')
  • 删除 ->fox(,'->')
  • 获取 god("('\"\"')")god("('\"\"')")
  • 删除 ->god("('\"\"')")
  • 结束

  • 现在,我正在通过这两个 RegEx 尝试 planB,但还不够好:
    loop
        if match "\R\s*->\s*(.+)$"
            get substring and remove
            loop substring
            if match "(?:(?<=\)).)*\s*->\s*(((?!->).)*)$"
                push substring2 to arr
                remove substring2
            else
                break
        else
            break
    

    最佳答案

    我不认为正则表达式是匹配您需要的最终手段,但它可以用于一次性任务。

    在 PCRE 中,我们有递归支持,因此我们可以匹配函数开始和结束。 如果代码没有任何注释 ,您可以将这些嵌套的 (...) 与字符串末尾的单引号和双引号字符串文字进行匹配

    (?:((?(3)\s*|\R*)->\s*([\w.]*(\((?>'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"‌​|[^"'()]++|(?3))*\)))))+\s*\z
    

    查看 regex demo

    解释:
  • (?:((?(3)\s*|\R*)->\s*([\w.]*(\((?>'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"‌​|[^"'()]++|(?3))*\)))))+ - 以下序列出现 1 次或多次:
  • (?(3)\s*|\R*) - 检查第 3 组是否匹配的条件,如果第 3 组已初始化,则匹配 0+ 个空白字符,如果第 3 组尚未匹配,则匹配 0+ 个换行序列(使用 \R* )(因此,我们仅在开始)
  • ->\s* - -> 后跟 0+ 空格
  • ([\w.]*) - (Group 1, function name) 0+ 字母数字/下划线/点字符
  • (\((?>'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|[^"'()]++|(?1))*\)) - 第 1 组匹配
  • \( - 文字开头 (
  • (?>'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|[^"'()]++|(?3))* - 单引号文字 ( '[^'\\]*(?:\\.[^'\\]*)*' ) 或双引号文字 ( "[^"\\]*(?:\\.[^"\\]*)*" ) 或 (...) ( [^"'()]++|(?3) 其中 (?3) 递归整个第 3 组子模式)。
  • \) - 字面关闭 )
  • \s*\z - 0+ 空格 \s* 就在字符串 \z 的末尾之前。
  • 10-08 04:03