我怎样才能获得" - >功能(' xxx',' xxx')"在一些文字的最后

时间:2016-04-08 06:38:42

标签: regex pcre

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

    1. 获取子串apple(,'a')
    2. 删除-> apple(,'a')
    3. 获取子串banana(,'a"\'\(\)\'->"()')
    4. 删除-> banana(,'a"\'\(\)\'->"()')
    5. 获取子串cat(,'b')
    6. 删除->cat(,'b')
    7. 获取子串dog(,'c')
    8. 删除->dog(,'c')
    9. 获取egg()
    10. 删除->egg()
    11. 获取fox(,'->')
    12. 删除->fox(,'->')
    13. 获取god("('\"\"')")god("('\"\"')")
    14. 删除->god("('\"\"')")
    15. OVER
  • 计划B:

    1. 获取并移除->cat(,'b')-> banana(,'a"\'\(\)\'->"()') -> apple(,'a')
      1. 获取子串apple(,'a')
      2. 删除-> apple(,'a')
      3. 获取子串banana(,'a"\'\(\)\'->"()')
      4. 删除-> banana(,'a"\'\(\)\'->"()')
      5. 获取子串cat(,'b')
      6. 删除->cat(,'b')
    2. 获取并移除->egg()->dog(,'c')
      1. 获取子串dog(,'c')
      2. 删除->dog(,'c')
      3. 获取egg()
      4. 删除->egg()
    3. 获取并移除->god("('\"\"')") ->fox(,'->')
      1. 获取fox(,'->')
      2. 删除->fox(,'->')
      3. 获取god("('\"\"')")god("('\"\"')")
      4. 删除->god("('\"\"')")
    4. OVER

现在,我正在通过这两个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

2 个答案:

答案 0 :(得分:1)

我认为正则表达式不是匹配所需内容的最终方法,但它可以用于一次性任务。

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

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

请参阅regex demo

解释

  • (?:((?(3)\s*|\R*)->\s*([\w.]*(\((?>'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"‌​|[^"'()]++|(?3))*\)))))+ - 以下序列中的一次或多次出现:
    • (?(3)\s*|\R*) - 一个条件,用于检查组3是否匹配,如果组3初始化,则匹配0+空白字符,并匹配0+换行序列(\R* )如果第3组尚未匹配(因此,我们仅在开始时匹配换行符)
    • ->\s* - ->后跟0 +空格
    • ([\w.]*) - (第1组,函数名称)0+字母数字/下划线/点字符
    • (\((?>'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|[^"'()]++|(?1))*\)) - 第1组匹配
      • \( - 字面开放(
      • (?>'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|[^"'()]++|(?3))* - 单引号文字('[^'\\]*(?:\\.[^'\\]*)*')或双引文字("[^"\\]*(?:\\.[^"\\]*)*")或(...)[^"'()]++|(?3)其中(?3) recurses整个第3组子模式)。
      • \) - 字面关闭)
  • \s*\z - 在字符串\s*的最后一个之前的0 +空格\z

答案 1 :(得分:-1)

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

现在公开的"Flex & Bison" O'Reilly是一本很好的读物。