找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 42307|回复: 23

[问题求助] chatgpt写的PowerShell正则平衡组示例改错

[复制链接]
发表于 2023-4-11 13:32:32 | 显示全部楼层 |阅读模式
刚刚让chatgpt写几个平衡组示例, 但是执行结果都是错的, 求路过大佬改正
也第一次看到正则表达式可以多行表示, 而且行尾还能加注释, C#不能这样玩吧
  1. $pattern = @"
  2. \(
  3.     (?>                     # 开始一个平衡组
  4.         [^()]+              # 匹配除了括号以外的任意字符
  5.         |                   # 或者
  6.         (?<paren>\()        # 匹配左圆括号并将其压入名为paren的平衡组中
  7.         |                   # 或者
  8.         (?<-paren>\))       # 匹配右圆括号并将其弹出名为paren的平衡组中
  9.     )*                      # 重复上述步骤多次
  10.     (?(paren)(?!))          # 如果paren平衡组不为空,则匹配失败
  11. \)
  12. "@

  13. $text = "This is (a (test) string) with (nested (parentheses))."
  14. $matches = [regex]::Matches($text, $pattern)
  15. foreach ($match in $matches) {
  16.     Write-Host $match.Value
  17. }
复制代码
发表于 2023-4-11 19:08:36 | 显示全部楼层
直接告诉chatgpt结果错了他会帮你改过来的呀,现在ai进化速度很快现在错了过一会可能就对了
 楼主| 发表于 2023-4-11 19:20:19 | 显示全部楼层
回复 2# idwma


    我让他改了N次, 都改不对
发表于 2023-4-11 19:27:30 | 显示全部楼层
这个例子看着没问题呀,什么样的结果才是对的?
 楼主| 发表于 2023-4-11 19:31:24 | 显示全部楼层
本帖最后由 小白龙 于 2023-4-11 19:32 编辑

回复 4# idwma

输出结果为空, 什么都没有输出, 应该输出所有括号
发表于 2023-4-11 19:57:44 | 显示全部楼层
本帖最后由 idwma 于 2023-4-11 19:59 编辑

回复 5# 小白龙


    确实是有结果的,是不是你的powershell版本不是最新的
(a (test) string)
(nested (parentheses))
 楼主| 发表于 2023-4-11 20:04:57 | 显示全部楼层
回复 6# idwma


   我用的是win7  ps5.1
发表于 2023-4-11 20:07:30 | 显示全部楼层
回复 7# 小白龙


    5.1不是最新的,告诉chatgpt用ps5.1来举例试试
发表于 2023-4-11 20:09:35 | 显示全部楼层
俺只知道目前地球上只有人类大脑和其它生物的才是智能。其它都是复读机,炒作=>股票

gpt 是错的

  1. $pattern = @"
  2. (?x)\(
  3.     (                   # 开始一个平衡组
  4.                 (?>[^()]*)      # 匹配除了括号以外的任意字符 固化不回溯,其实多余 因[^()]*本身最多回溯一个字符,
  5.         |               # 分支
  6.         (?<o>\()        # 匹配左圆括号并将其压入名为o的栈
  7.         |               # 分支
  8.         (?<-o>\))       # 匹配右圆括号并将其弹出名为o的栈
  9.     )*                  # 重复上述步骤多次
  10.     (?(o)(?!))          # 如果o平衡组不为空,则匹配失败
  11. \)
  12. "@
  13. [regex]::Matches($text, $pattern).Value
复制代码

  1. [regex]::Matches($text, "(?x)\( ( [^()]* | (?<o>\() | (?<-o>\)) )*(?(o)(?!)) \)").Value
复制代码

评分

参与人数 2技术 +2 收起 理由
idwma + 1 学到了
小白龙 + 1 乐于助人

查看全部评分

发表于 2023-4-11 20:18:17 | 显示全部楼层
再次声明: ? 不参与匹配, + * 均匹配从匹配点起的后面的全部(不是网上说的匹配0个1个多个)然后回溯,结果写入 GROUPS[0]中。
 楼主| 发表于 2023-4-11 20:19:10 | 显示全部楼层
回复 8# idwma


    哎, 问了七八轮了, 还没有答对, 太垃圾了
 楼主| 发表于 2023-4-11 20:29:20 | 显示全部楼层
回复 10# xczxczxcz


    大佬, 牛X啊, 对正则理解太深刻了, 有什么精华的正则教程链接给推荐一下吗
发表于 2023-4-11 20:29:35 | 显示全部楼层
毕竟是人工智能嘛,还是离不开人,按x大的加上忽略转义空白(?x)其实也是有结果的
 楼主| 发表于 2023-4-11 20:45:04 | 显示全部楼层
回复 13# idwma

什么意思, x大的那两个正则都可以直接出结果的, 在ps5.1
发表于 2023-4-11 20:50:55 | 显示全部楼层
回复 14# 小白龙

你看像这样,gpt给的没忽略非转义空白,加上(?x)就好了
  1. $pattern = @"
  2. (?x)\(
  3.     (?>                     # 开始一个平衡组
  4.         [^()]+              # 匹配除了括号以外的任意字符
  5.         |                   # 或者
  6.         (?<paren>\()        # 匹配左圆括号并将其压入名为paren的平衡组中
  7.         |                   # 或者
  8.         (?<-paren>\))       # 匹配右圆括号并将其弹出名为paren的平衡组中
  9.     )*                      # 重复上述步骤多次
  10.     (?(paren)(?!))          # 如果paren平衡组不为空,则匹配失败
  11. \)
  12. "@
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:02 , Processed in 0.021543 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表