我想在一段代码的末尾得到一个或多个->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
答案 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是一本很好的读物。