返回列表 发帖

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

刚刚让chatgpt写几个平衡组示例, 但是执行结果都是错的, 求路过大佬改正
也第一次看到正则表达式可以多行表示, 而且行尾还能加注释, C#不能这样玩吧
$pattern = @"
\(
    (?>                     # 开始一个平衡组
        [^()]+              # 匹配除了括号以外的任意字符
        |                   # 或者
        (?<paren>\()        # 匹配左圆括号并将其压入名为paren的平衡组中
        |                   # 或者
        (?<-paren>\))       # 匹配右圆括号并将其弹出名为paren的平衡组中
    )*                      # 重复上述步骤多次
    (?(paren)(?!))          # 如果paren平衡组不为空,则匹配失败
\)
"@
$text = "This is (a (test) string) with (nested (parentheses))."
$matches = [regex]::Matches($text, $pattern)
foreach ($match in $matches) {
    Write-Host $match.Value
}COPY

直接告诉chatgpt结果错了他会帮你改过来的呀,现在ai进化速度很快现在错了过一会可能就对了

TOP

回复 2# idwma


    我让他改了N次, 都改不对

TOP

这个例子看着没问题呀,什么样的结果才是对的?

TOP

本帖最后由 小白龙 于 2023-4-11 19:32 编辑

回复 4# idwma

输出结果为空, 什么都没有输出, 应该输出所有括号

TOP

本帖最后由 idwma 于 2023-4-11 19:59 编辑

回复 5# 小白龙


    确实是有结果的,是不是你的powershell版本不是最新的
(a (test) string)
(nested (parentheses))

TOP

回复 6# idwma


   我用的是win7  ps5.1

TOP

回复 7# 小白龙


    5.1不是最新的,告诉chatgpt用ps5.1来举例试试

TOP

俺只知道目前地球上只有人类大脑和其它生物的才是智能。其它都是复读机,炒作=>股票

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

评分人数

QQ: 458609586
脚本优先 [PowerShell win10]

TOP

再次声明: ? 不参与匹配, + * 均匹配从匹配点起的后面的全部(不是网上说的匹配0个1个多个)然后回溯,结果写入 GROUPS[0]中。
QQ: 458609586
脚本优先 [PowerShell win10]

TOP

回复 8# idwma


    哎, 问了七八轮了, 还没有答对, 太垃圾了

TOP

回复 10# xczxczxcz


    大佬, 牛X啊, 对正则理解太深刻了, 有什么精华的正则教程链接给推荐一下吗

TOP

毕竟是人工智能嘛,还是离不开人,按x大的加上忽略转义空白(?x)其实也是有结果的

TOP

回复 13# idwma

什么意思, x大的那两个正则都可以直接出结果的, 在ps5.1

TOP

回复 14# 小白龙

你看像这样,gpt给的没忽略非转义空白,加上(?x)就好了
$pattern = @"
(?x)\(
    (?>                     # 开始一个平衡组
        [^()]+              # 匹配除了括号以外的任意字符
        |                   # 或者
        (?<paren>\()        # 匹配左圆括号并将其压入名为paren的平衡组中
        |                   # 或者
        (?<-paren>\))       # 匹配右圆括号并将其弹出名为paren的平衡组中
    )*                      # 重复上述步骤多次
    (?(paren)(?!))          # 如果paren平衡组不为空,则匹配失败
\)
"@COPY

TOP

返回列表