Regex PowerShell将带括号的变量传递给正则表达式
我被一个正则表达式问题缠住了。我有一个文本文件,它有很多应用程序名,在开头和结尾都有不同的随机字符。有些应用程序用括号表示它的位版本(x64)和(x86)。我检查每个应用程序,取其名称并将其传递给我的函数。从那里,我将它与另一个文本文件进行比较,看看它在安装时是否有“OK”。但是,我的函数使用正则表达式,当我传递应用程序名称进行比较时,它就失败了,因为括号是正则表达式字符。这是我的功能Regex PowerShell将带括号的变量传递给正则表达式,regex,powershell,Regex,Powershell,我被一个正则表达式问题缠住了。我有一个文本文件,它有很多应用程序名,在开头和结尾都有不同的随机字符。有些应用程序用括号表示它的位版本(x64)和(x86)。我检查每个应用程序,取其名称并将其传递给我的函数。从那里,我将它与另一个文本文件进行比较,看看它在安装时是否有“OK”。但是,我的函数使用正则表达式,当我传递应用程序名称进行比较时,它就失败了,因为括号是正则表达式字符。这是我的功能 function Get_End($Application) { $EndRegex = [regex
function Get_End($Application)
{
$EndRegex = [regex]"($Application).*(END OK)"
try
{
$result = Get-Content "C:\temp\test.log" | Where-Object{ $_ -Match
$EndRegex }
if($result -eq $null)
{
return "Not Found"
}
else
{
return $Matches[2]
}
}
catch
{
Return "ERROR"
}
}
这就是我传递变量名的方式:
Get_End($ApplicationName)
我尝试在函数中使用{}而不是()将$放在前面,但没有成功
有人知道怎么避开这个吗
提前谢谢 如果您担心正则表达式控制字符被传递到您的函数,请让您的函数承担最坏的后果
$EndRegex = "($([regex]::Escape($Application))).*(END OK)"
这将自动在
$application
中找到的所有控制字符前面添加转义字符$EndRegex
未用作[regex]
对象,因此强制转换在此处是多余的。把它当作一根绳子放在这里就行了 如果您担心正则表达式控制字符被传递到您的函数,请让您的函数承担最坏的后果
$EndRegex = "($([regex]::Escape($Application))).*(END OK)"
$EndRegex = [regex]"($Application).*(END OK)"
这将自动在$application
中找到的所有控制字符前面添加转义字符$EndRegex
未用作[regex]
对象,因此强制转换在此处是多余的。把它当作一根绳子放在这里就行了
$EndRegex = [regex]"($Application).*(END OK)"
这个字符串中有很多控制字符。想必,*
是您实际尝试使用的唯一正则表达式模式?在这种情况下,您需要转义$Application
中的所有控制字符以及字符串中的括号。正则表达式字符串的转义字符是反斜杠
我会这样做:
$EndRegex = [regex]("\({0}\).*\(END OK\)" -f [RegEx]::Escape($Application))
这个字符串中有很多控制字符。想必,*
是您实际尝试使用的唯一正则表达式模式?在这种情况下,您需要转义$Application
中的所有控制字符以及字符串中的括号。正则表达式字符串的转义字符是反斜杠
我会这样做:
$EndRegex = [regex]("\({0}\).*\(END OK\)" -f [RegEx]::Escape($Application))
这样调用函数时要小心。正确的语法只是
Get\u End$ApplicationName
。您的语法会起作用,但请记住括号是一个分组运算符,虽然成员函数像C#一样使用它们,但用户定义的函数不会!如果您创建了一个2参数函数,那么您会发现MyFunction($Arg1,$Arg2)
将失败,因为PowerShell将尝试将$Arg1和$Arg2传递给第一个参数,而不会将任何内容传递给第二个参数。感谢您@BaconBits的回复。你完全正确。我一直在C#和powershell之间切换,而你让我意识到我是在用C#来称呼它。谢谢你这么做。小心那样调用你的函数。正确的语法只是Get\u End$ApplicationName
。您的语法会起作用,但请记住括号是一个分组运算符,虽然成员函数像C#一样使用它们,但用户定义的函数不会!如果您创建了一个2参数函数,那么您会发现MyFunction($Arg1,$Arg2)
将失败,因为PowerShell将尝试将$Arg1和$Arg2传递给第一个参数,而不会将任何内容传递给第二个参数。感谢您@BaconBits的回复。你完全正确。我一直在C#和powershell之间切换,而你让我意识到我是在用C#来称呼它。谢谢你。谢谢@BaconBits。这是可行的,但我认为马特的要简单得多。再次感谢您的快速回复。谢谢@BaconBits。这是可行的,但我认为马特的要简单得多。再次感谢您的快速回复。