我想在一段代码的末尾得到一个或多个 ->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')
在这段代码中,我想:
apple(,'a')
-> apple(,'a')
banana(,'a"\'\(\)\'->"()')
-> banana(,'a"\'\(\)\'->"()')
cat(,'b')
->cat(,'b')
dog(,'c')
->dog(,'c')
egg()
->egg()
fox(,'->')
->fox(,'->')
god("('\"\"')")god("('\"\"')")
->god("('\"\"')")
->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
的末尾之前。