标题: [问题求助] 正则取文本把GPT折腾的晕头转向 [打印本页]
作者: 小白龙 时间: 2024-10-6 12:01 标题: 正则取文本把GPT折腾的晕头转向
要处理的文本是一些函数定义, 我想用正则表达式来获取函数名中包含Main的函数体内的文本, 最终执行的结果在代码的最后注释中,
需要使用正则表达式来获取, 我用GPT试了不少几十轮, 成功率为0
求路过大佬支招- $s = @'
- 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;
- }
- '@
-
- <# 上面要处理的文本是一些函数定义, 我想用正则表达式来获取函数名中包含Main的函数体内的文本, 即最终执行的结果如下:
-
- string s = """
- _Main0
- {hello {world {
- }
- """;
- Console.WriteLine(s);
-
- string s = """
- _Main2
- {hello {world }
- {
- """;
- return s;
- #>
复制代码
作者: 小白龙 时间: 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 编辑
- $s = @'
- using System;
-
- public static void _Main0() {
- /*
- *multiline comment
-
- */
- string s = """
- _Main0
- {hello {world {
- }
- """;//singleline comment
-
- Console.WriteLine(s);
- if(a=b){echo 111;/*comment
- */}
- //comment
- }
-
- 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;
- }
- '@
- <#
- $re=[regex]'(?s)\b_Main(?>\w*)(?>\s*)\((?>[^)]*)\)(?>[^{]*)(?<o>\{)(?>/\*.*?\*/|//[^\n]*|"(?>""|\\"|[^"])*"|(?<o>\{)|(?<c-o>\})|.)+?(?(o)!)'
- $ms=$re.Matches($s)
- foreach($m in $ms){
- $gpc=$m.Groups['c']
- $gpc.Captures[$gpc.Count-1].Value
- '---------------'|Write-Host -ForegroundColor Green
- }
- #>
- $re=[regex]'(?s)\b_Main(?>\w*)(?>\s*)\((?>[^)]*)\)(?>[^{]*)(?<o>\{)(?<body>(?>/\*.*?\*/|//[^\n]*|"(?>""|\\"|[^"])*"|(?<o>\{)|(?<-o>\})|.)*?)(?<-o>\})(?(o)!)'
- $ms=$re.Matches($s)
- foreach($m in $ms){
- '---------------'|Write-Host -ForegroundColor Green
- $m.Groups['body'].Value
- '---------------'|Write-Host -ForegroundColor Green
- }
- <# 上面要处理的文本是一些函数定义, 我想用正则表达式来获取函数名中包含Main的函数体内的文本, 即最终执行的结果如下:
-
- string s = """
- _Main0
- {hello {world {
- }
- """;
- Console.WriteLine(s);
-
- string s = """
- _Main2
- {hello {world }
- {
- """;
- return s;
- #>
复制代码
作者: 小白龙 时间: 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# 小白龙
手把手包教包会- <#
- .SYNOPSIS
- Get the C# Method body string
-
- .DESCRIPTION
- Get the C# Method body string
-
- .PARAMETER Code
- C# code
-
- .PARAMETER Method
- The method name
-
- .PARAMETER Qualifiers
- the qualifiers of the method,i.e. public,static
-
- .EXAMPLE
- Get-CSBody -Code $s -Method _Main0 -Qualifiers static,public
- Get-CSBody -Code $s -Method _Main2 -Qualifiers static,public,string
-
- .NOTES
- General notes
- #>
- function Get-CSBody {
- param(
- [string]$Code,
- [string]$Method,
- [string[]]$Qualifiers
- )
- $re = [regex]@"
- \b${Method}$(-join ($Qualifiers|ForEach-Object{"(?<=\b${_}\b.*)"}))(?s)(?>\s*)\((?>[^)]*)\)(?>[^{]*)(?<o>\{)(?<body>(?>/\*.*?\*/|//[^\n]*|"(?>""|\\"|[^"])*"|(?<o>\{)|(?<-o>\})|.)*?)(?<-o>\})(?(o)!)
- "@
- $ms = $re.Matches($Code)
- foreach ($m in $ms) {
- #'---------------'|Write-Host -ForegroundColor Green
- $m.Groups['body'].Value
- #'---------------'|Write-Host -ForegroundColor Green
- }
- }
- Get-CSBody -Code $s -Method _Main0 -Qualifiers static,public
- 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# 小白龙
可以的- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |