[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 正则取文本把GPT折腾的晕头转向

要处理的文本是一些函数定义, 我想用正则表达式来获取函数名中包含Main的函数体内的文本, 最终执行的结果在代码的最后注释中,
需要使用正则表达式来获取, 我用GPT试了不少几十轮, 成功率为0
求路过大佬支招
  1. $s = @'
  2. using System;
  3. public static void _Main0() {
  4. string s = """
  5. _Main0
  6. {hello {world {
  7. }
  8. """;
  9. Console.WriteLine(s);
  10. }
  11. public void _func0(string s1)
  12. {
  13. string s = """
  14. _func0
  15. }hello }world }
  16. """;
  17. Console.WriteLine(s + s1);
  18. }
  19. public void _func2() {
  20. string s = """
  21. _func2
  22. }hello }world
  23. """;
  24. Console.WriteLine(s);
  25. }
  26. public static string _Main2(int i)
  27. {
  28. string s = """
  29. _Main2
  30. {hello {world }
  31. {
  32. """;
  33. return s;
  34. }
  35. '@
  36. <# 上面要处理的文本是一些函数定义, 我想用正则表达式来获取函数名中包含Main的函数体内的文本, 即最终执行的结果如下:
  37. string s = """
  38. _Main0
  39. {hello {world {
  40. }
  41. """;
  42. Console.WriteLine(s);
  43. string s = """
  44. _Main2
  45. {hello {world }
  46. {
  47. """;
  48. return s;
  49. #>
复制代码

var m=s.split('"""')
for(var i=0;i<m.length;i++){
if(m[i].contain("main")){
show(m[i+1])
i++
}
}

判断标志性的"""就可以了吧 把字符串断成无数节 第i有main 那下一节就是要的
你好

TOP

回复 18# flashercs


   刚把ISE重启试了一下, 又可以了,

TOP

回复 17# 小白龙

可以的
  1. Get-CSBody $s out public,static,void
复制代码
微信:flashercs
QQ:49908356

TOP

本帖最后由 小白龙 于 2024-10-7 08:50 编辑

回复 6# flashercs


    大佬, 我刚试了一下, 不能匹配下面这种单行的函数定义
public static void out(object x) { Console.WriteLine(x.ToString()); }

TOP

回复 12# 小白龙


    我脑子不好,不会弄

TOP

回复 13# 小白龙
手把手包教包会
  1. <#
  2. .SYNOPSIS
  3. Get the C# Method body string
  4. .DESCRIPTION
  5. Get the C# Method body string
  6. .PARAMETER Code
  7. C# code
  8. .PARAMETER Method
  9. The method name
  10. .PARAMETER Qualifiers
  11. the qualifiers of the method,i.e. public,static
  12. .EXAMPLE
  13. Get-CSBody -Code $s -Method _Main0 -Qualifiers static,public
  14. Get-CSBody -Code $s -Method _Main2 -Qualifiers static,public,string
  15. .NOTES
  16. General notes
  17. #>
  18. function Get-CSBody {
  19. param(
  20. [string]$Code,
  21. [string]$Method,
  22. [string[]]$Qualifiers
  23. )
  24. $re = [regex]@"
  25. \b${Method}$(-join ($Qualifiers|ForEach-Object{"(?<=\b${_}\b.*)"}))(?s)(?>\s*)\((?>[^)]*)\)(?>[^{]*)(?<o>\{)(?<body>(?>/\*.*?\*/|//[^\n]*|"(?>""|\\"|[^"])*"|(?<o>\{)|(?<-o>\})|.)*?)(?<-o>\})(?(o)!)
  26. "@
  27. $ms = $re.Matches($Code)
  28. foreach ($m in $ms) {
  29. #'---------------'|Write-Host -ForegroundColor Green
  30. $m.Groups['body'].Value
  31. #'---------------'|Write-Host -ForegroundColor Green
  32. }
  33. }
  34. Get-CSBody -Code $s -Method _Main0 -Qualifiers static,public
  35. Get-CSBody -Code $s -Method _Main2 -Qualifiers public,string
复制代码
微信:flashercs
QQ:49908356

TOP

括号套括号很难用正则
不如试试栈 或者括号计数器
你好

TOP

回复 11# Five66


   用gpt, 让他用解析语法也不行, 输出为空, N轮都没戏, 哎

TOP

回复 11# Five66


    大佬能给个示例代码吗? 用楼上大佬的貌似就可以, 但是看不懂

TOP

这东西正则怎么能搞定?建议去抄C#编译器的词法分析很语法分析的代码

TOP

本帖最后由 小白龙 于 2024-10-6 20:40 编辑

回复 9# flashercs

多谢大佬帮助, 实在太复杂了, 问了GPT也没解释清楚,

我想将这个功能定义为一个函数应该怎样改呢?  

例如, 我想取 public修饰词开头, 函数名为_Main0的函数体内的文本, 或整个函数定义的文本(一般来讲, 正则的完整匹配应该就是整个函数定义的文本吧?)

为了让函数更具适应性, 有时函数定义没有用public开头, 而是static开头, 问题来了:
那我就想取 static修饰词开头, 函数名为_Main0的函数体内的文本,

或者有更好的方法吗?

TOP

回复 8# 小白龙


    上面修改了,换了一种方式
微信:flashercs
QQ:49908356

TOP

回复 6# flashercs

_Main0函数体应该取出如下的文本
   
/*
*multiline comment

*/
        string s = """
_Main0
{hello {world {
}
""";//singleline comment

        Console.WriteLine(s);
    if(a=b){echo 111;/*comment
    */}
    //comment

TOP

回复 6# flashercs


    我看大佬把 _Main0 函数体内添加了一些干扰文本, 但是最后的执行结果, 并没有全部取出来

结果如下:

echo 111;/*comment
    */
---------------

        string s = """
_Main2
{hello {world }
{
""";
        return s;

---------------

TOP

返回列表