如何在某些文本末尾获取“->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')
在这段代码中,我想:
计划 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中,我们有递归支持,因此我们可以匹配函数的开始和结束。 如果代码没有任何注释,您可以将这些嵌套的(...)
连同字符串末尾的单引号和双引号字符串文字与[=33=匹配]
(?:((?(3)\s*|\R*)->\s*([\w.]*(\((?>'[^'\]*(?:\.[^'\]*)*'|"[^"\]*(?:\.[^"\]*)*"|[^"'()]++|(?3))*\)))))+\s*\z
解释:
(?:((?(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 是一本好书。
我想在一段代码的末尾得到一个或多个->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中,我们有递归支持,因此我们可以匹配函数的开始和结束。 如果代码没有任何注释,您可以将这些嵌套的(...)
连同字符串末尾的单引号和双引号字符串文字与[=33=匹配]
(?:((?(3)\s*|\R*)->\s*([\w.]*(\((?>'[^'\]*(?:\.[^'\]*)*'|"[^"\]*(?:\.[^"\]*)*"|[^"'()]++|(?3))*\)))))+\s*\z
解释:
(?:((?(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 是一本好书。