Board logo

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

作者: 小白龙    时间: 2024-10-6 12:01     标题: 正则取文本把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. #>
复制代码

作者: 小白龙    时间: 2024-10-6 14:00

我试了几乎所有的ai, 在这个问题面前都躺平了
作者: flashercs    时间: 2024-10-6 17:35

获取的没错,不知道目的是获取哪些?
作者: 小白龙    时间: 2024-10-6 17:45

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

回复 3# flashercs
获取下面的红色字部分, 这些都是函数名中包含文本Main的函数的函数体, 也就是花括号内的文本

using System;

public static void _Main0() {
        string s = """
_Main0
{hello {world {
}
""";
        Console.WriteLine(s);

}

public void _func0(string s1)
{
        string s = """
_func0
}hello }world }
""";
        Console.WriteLine(s + s1);
}

public void _func2() {
        string s = """
_func2
}hello }world
""";
        Console.WriteLine(s);
}

public static string _Main2(int i)
{
        string s = """
_Main2
{hello {world }
{
""";
        return s;

}
作者: 小白龙    时间: 2024-10-6 17:49

回复 3# flashercs


    大佬能支招一下吗? 应该就是用平衡组正则获取到整个函数, 然后把函数体的文本定义到一个()组中, 然后取这个组的值, 多谢
作者: flashercs    时间: 2024-10-6 18:52

本帖最后由 flashercs 于 2024-10-6 19:16 编辑
  1. $s = @'
  2. using System;
  3. public static void _Main0() {
  4. /*
  5. *multiline comment
  6. */
  7. string s = """
  8. _Main0
  9. {hello {world {
  10. }
  11. """;//singleline comment
  12. Console.WriteLine(s);
  13.     if(a=b){echo 111;/*comment
  14.     */}
  15.     //comment
  16. }
  17. public void _func0(string s1)
  18. {
  19. string s = """
  20. _func0
  21. }hello }world }
  22. """;
  23. Console.WriteLine(s + s1);
  24. }
  25. public void _func2() {
  26. string s = """
  27. _func2
  28. }hello }world
  29. """;
  30. Console.WriteLine(s);
  31. }
  32. public static string _Main2(int i)
  33. {
  34. string s = """
  35. _Main2
  36. {hello {world }
  37. {
  38. """;
  39. return s;
  40. }
  41. '@
  42. <#
  43. $re=[regex]'(?s)\b_Main(?>\w*)(?>\s*)\((?>[^)]*)\)(?>[^{]*)(?<o>\{)(?>/\*.*?\*/|//[^\n]*|"(?>""|\\"|[^"])*"|(?<o>\{)|(?<c-o>\})|.)+?(?(o)!)'
  44. $ms=$re.Matches($s)
  45. foreach($m in $ms){
  46. $gpc=$m.Groups['c']
  47. $gpc.Captures[$gpc.Count-1].Value
  48. '---------------'|Write-Host -ForegroundColor Green
  49. }
  50. #>
  51. $re=[regex]'(?s)\b_Main(?>\w*)(?>\s*)\((?>[^)]*)\)(?>[^{]*)(?<o>\{)(?<body>(?>/\*.*?\*/|//[^\n]*|"(?>""|\\"|[^"])*"|(?<o>\{)|(?<-o>\})|.)*?)(?<-o>\})(?(o)!)'
  52. $ms=$re.Matches($s)
  53. foreach($m in $ms){
  54. '---------------'|Write-Host -ForegroundColor Green
  55. $m.Groups['body'].Value
  56. '---------------'|Write-Host -ForegroundColor Green
  57. }
  58. <# 上面要处理的文本是一些函数定义, 我想用正则表达式来获取函数名中包含Main的函数体内的文本, 即最终执行的结果如下:
  59. string s = """
  60. _Main0
  61. {hello {world {
  62. }
  63. """;
  64. Console.WriteLine(s);
  65. string s = """
  66. _Main2
  67. {hello {world }
  68. {
  69. """;
  70. return s;
  71. #>
复制代码

作者: 小白龙    时间: 2024-10-6 18:57

回复 6# flashercs


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

结果如下:

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

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

---------------
作者: 小白龙    时间: 2024-10-6 19:00

回复 6# flashercs

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

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

        Console.WriteLine(s);
    if(a=b){echo 111;/*comment
    */}
    //comment
作者: flashercs    时间: 2024-10-6 19:11

回复 8# 小白龙


    上面修改了,换了一种方式
作者: 小白龙    时间: 2024-10-6 20:27

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

回复 9# flashercs

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

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

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

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

或者有更好的方法吗?
作者: Five66    时间: 2024-10-6 22:21

这东西正则怎么能搞定?建议去抄C#编译器的词法分析很语法分析的代码
作者: 小白龙    时间: 2024-10-6 22:24

回复 11# Five66


    大佬能给个示例代码吗? 用楼上大佬的貌似就可以, 但是看不懂
作者: 小白龙    时间: 2024-10-6 22:49

回复 11# Five66


   用gpt, 让他用解析语法也不行, 输出为空, N轮都没戏, 哎
作者: jyswjjgdwtdtj    时间: 2024-10-6 23:00

括号套括号很难用正则
不如试试栈 或者括号计数器
作者: flashercs    时间: 2024-10-6 23:33

回复 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
复制代码

作者: Five66    时间: 2024-10-7 00:05

回复 12# 小白龙


    我脑子不好,不会弄
作者: 小白龙    时间: 2024-10-7 08:49

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

回复 6# flashercs


    大佬, 我刚试了一下, 不能匹配下面这种单行的函数定义
public static void out(object x) { Console.WriteLine(x.ToString()); }
作者: flashercs    时间: 2024-10-7 13:04

回复 17# 小白龙

可以的
  1. Get-CSBody $s out public,static,void
复制代码

作者: 小白龙    时间: 2024-10-7 14:28

回复 18# flashercs


   刚把ISE重启试了一下, 又可以了,
作者: jyswjjgdwtdtj    时间: 2024-10-9 22:15

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

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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2