标题: [问题求助] 正则匹配函数定义前后的文本 [打印本页]
作者: 小白龙 时间: 2024-10-7 08:39 标题: 正则匹配函数定义前后的文本
本帖最后由 小白龙 于 2024-10-7 08:52 编辑
问了gpt几十轮, 仍不得其解, 求路过大佬支招, 感谢
PS: 是我描述的不清楚吗? 用了智谱, gpt, kimi, deepseek, 都是弱智, 唉
感觉用flashercs大佬的下面代码中的正则匹配可以解决, 但是让gpt改, 也没解决
http://www.bathome.net/redirect. ... 9891&pid=284800
-------------------------------------------------------------------------------------------------------
写一个名为addPubText的函数,
函数的参数是一段文本, 里面有一些函数的定义;
函数的功能是:
功能A.用正则判断第一个public的函数定义的前面是否存在一些非函数定义的文本:
如果有:
在这些文本的最前面添加 public static void Main() {
在这些文本的后面添加 }
最后返回处理后的完整文本
如果没有: 则返回空
功能B.用正则判断最后一个public的函数定义的后面是否存在一些非函数定义的文本:
如果有:
在这些文本的最前面添加 public static void Main() {
在这些文本的后面添加 }
最后返回处理后的完整文本
如果没有: 则返回空- $s1 = @'
- string Txt = "hello";
- string Name = "world";
-
- public static void func1(string s) {
- Console.WriteLine(s);
- out(1);
- }
-
- public static void out(object x)
- {
- Console.WriteLine(x.ToString());
- }
- '@
- <# 变量$s1经过addPubText函数处理后, 最后要得到的结果如下:
- public static void Main(){
- string Txt = "hello";
- string Name = "world";
- }
-
- public static void func1(string s) {
- Console.WriteLine(s);
- out(1);
- }
-
- public static void out(object x)
- {
- Console.WriteLine(x.ToString());
- }
- #>
-
- $s2 = @'
- public static void func1(string s)
- {
- Console.WriteLine(s);
- out(1);
- }
-
- public static void out(object x) { Console.WriteLine(x.ToString()); }
-
- string Txt = "hello";
- string Name = "world";
- '@
- <# 变量$s2经过addPubText函数处理后, 最后要得到的结果如下:
- public static void func1(string s)
- {
- Console.WriteLine(s);
- out(1);
- }
-
- public static void out(object x) { Console.WriteLine(x.ToString()); }
-
- public static void Main(){
- string Txt = "hello";
- string Name = "world";
- }
- #>
复制代码
作者: 小白龙 时间: 2024-10-7 08:40
gpt的答案:- function addPubText
- {
- param (
- [string]$text
- )
-
- $mainFunction = "public static void Main()`r`n{`r`n"
- $closingBrace = "`r`n}`r`n"
-
- # 功能A: 检查第一个 public 函数定义前的非函数文本
- if ($text -match '^(.*?)\s*public\s+.*?\s*\(.*?\)\s*{')
- {
- $beforePublic = $matches[1].Trim()
- if ($beforePublic)
- {
- $text = $mainFunction + $beforePublic + $closingBrace + $text
- return $text
- }
- }
-
- # 功能B: 检查最后一个 public 函数定义后的非函数文本
- if ($text -match 'public\s+.*?\s*\(.*?\)\s*{.*?}([\s\S]*)$')
- {
- $afterPublic = $matches[1].Trim()
- if ($afterPublic)
- {
- $text = $text + $mainFunction + $afterPublic + $closingBrace
- return $text
- }
- }
-
- return ""
- }
- # 调用函数
- $result1 = addPubText $s1
- $result2 = addPubText $s2
-
- # 输出结果
- $result1
- $result2
复制代码
作者: flashercs 时间: 2024-10-7 12:48
- function Add-PubText {
- param (
- [ValidateNotNullOrEmpty()]
- [string]$text
- )
- $reMethod = [regex]'(?ms)^(?>\s*)public\b[^(]*\b\w+\b(?>\s*)\((?>[^)]*)\)(?>[^{]*)(?<o>\{)(?>/\*.*?\*/|//[^\n]*|"(?>""|\\"|[^"])*"|(?<o>\{)|(?<-o>\})|.)+?(?(o)!)\s*'
- $ms = $reMethod.Matches($text)
- if ($ms.Count -eq 0) { return '' }
- $prefix = $text.Substring(0, $ms[0].Index)
- $suffix = $text.Substring($ms[0].Index)
- if ($prefix -match '\S') {
- $prefix = @"
- public static void Main()
- {
- $prefix
- }
- "@
- return $prefix + $suffix
- }
- $t = $ms[$ms.Count - 1].Index + $ms[$ms.Count - 1].Length
- $prefix = $text.Substring(0, $t)
- $suffix = $text.Substring($t)
- if ($suffix -match '\S') {
- $suffix = @"
- public static void Main()
- {
- $suffix
- }
- "@
- return $prefix + $suffix
- }
- return ''
- }
- Add-PubText $s1
- Add-PubText $s2
复制代码
作者: 小白龙 时间: 2024-10-8 07:22
回复 3# flashercs
多谢大佬支招,
用正则很利索, 能否用编程的方法实现? 让gpt转成编程的方法, 还是搞不定
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |