如何在某些文本末尾获取“->function('xxx','xxx')”

How can I get "->function('xxx','xxx')" in the end of some text

我想在一段代码的末尾得到一个或多个->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')

在这段代码中,我想:

现在,我正在通过这两个 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中,我们有递归支持,因此我们可以匹配函数的开始和结束。 如果代码没有任何注释,您可以将这些嵌套的(...)连同字符串末尾的单引号和双引号字符串文字与[=33=匹配]

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

regex demo

解释:

  • (?:((?(3)\s*|\R*)->\s*([\w.]*(\((?>'[^'\]*(?:\.[^'\]*)*'|"[^"\]*(?:\.[^"\]*)*"‌​|[^"'()]++|(?3))*\)))))+ - 以下序列出现 1 次或多次:
    • (?(3)\s*|\R*) - 条件 检查第 3 组是否匹配,如果第 3 组已初始化,则匹配 0+ 个空白字符,并匹配 0+ 个换行符序列(与\R*) 如果第 3 组尚未匹配(因此,我们只在开始时匹配换行符)
    • ->\s* - -> 后跟 0+ 空格
    • ([\w.]*) -(第 1 组,函数名称)0+ alphanumeric/underscore/dot 个字符
    • (\((?>'[^'\]*(?:\.[^'\]*)*'|"[^"\]*(?:\.[^"\]*)*"|[^"'()]++|(?1))*\)) - 第 1 组匹配
      • \( - 文字开头 (
      • (?>'[^'\]*(?:\.[^'\]*)*'|"[^"\]*(?:\.[^"\]*)*"|[^"'()]++|(?3))* - 单引号文字 ('[^'\]*(?:\.[^'\]*)*') 或双引号文字 ("[^"\]*(?:\.[^"\]*)*") 或 (...) ([^"'()]++|(?3) 其中 (?3) 递归整个第 3 组子模式)。
      • \) - 文字结束 )
  • \s*\z - 0+ 空格 \s* 就在字符串的最后 \z.

正确的答案是,你不能用正则表达式来解析非正则语言。您需要使用该语言的现有解析器(如果存在)或编写您自己的解析器。

现已公开的 "Flex & Bison" O'Reilly 是一本好书。