gpt4 book ai didi

regex - 从查找表中捕获要替换的正则表达式匹配项

转载 作者:行者123 更新时间:2023-12-02 23:53:07 27 4
gpt4 key购买 nike

我正在PowerShell中编写语言解释器(对于那些可能感兴趣的人来说,语言是PILOT),现在我已经实现了变量替换。变量名称由$#组成,在集合[A-Za-z0-9]中最多由十个字符组成。但是,如果变量名带有\前缀,则不应替换它。据我所知,我要匹配的模式是[^\\][\$#]\w{,10},但是我不清楚如何将匹配结果存储在PowerShell变量中,这样我就可以在表中查找变量名称以用它的值替换它。

例如,如果powershell变量$expr包含字符串\#Foo has the value #Foo,并且$vartable["#Foo"]包含值5,则需要在$ varname中捕获#Foo(仅第二个),然后用$ vartable [$替换捕获的#Foo。 varname]-$expr -replace "[^\\][\$#]\w{,10}",$vartable[$varname]应该产生\#Foo has the value 5

我是否正确计算了模式,如何捕获匹配?

(我应该注意,我正在使用PowerShell 5.1进行开发,但是希望它能够在该版本或更高版本中运行,包括非Windows操作系统上的PSCore。)

最佳答案

[^\\]模式通常不是检查字符是否转义的有效方法,因为反斜杠也可以转义以表示文字的反斜杠char。例如,\\#Foo具有一个未转义的变量,必须根据原始要求进行匹配。有效的方法是使用与(?<=(?<!\\)(?:\\{2})*) .NET兼容的后向匹配项,该匹配项与立即在其前面加上任意数量的偶​​数反斜杠而不是反斜杠的位置匹配。

接下来,您不能在字符串替换模式内使用代码。您可以在[regex]::Replace内部使用回调,或者-从PowerShell Core v6.1开始-您可以使用脚本块作为-replace的替换参数:

[regex]::Replace($s,'(?<=(?<!\\)(?:\\{2})*)[$#]\w{1,10}\b', {param($match) $vartable[$match.Value] })

或(PowerShell Core v6.1 +):
$s -replace '(?<=(?<!\\)(?:\\{2})*)[$#]\w{1,10}\b', { $vartable[$_.Value] }

关于regex - 从查找表中捕获要替换的正则表达式匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53768740/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com