Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex PowerShell正则表达式中的转义字符串为常规字符串_Regex_Powershell_Powershell 5.0 - Fatal编程技术网

Regex PowerShell正则表达式中的转义字符串为常规字符串

Regex PowerShell正则表达式中的转义字符串为常规字符串,regex,powershell,powershell-5.0,Regex,Powershell,Powershell 5.0,我有一个字符串,其中包含一些正则表达式,$(=?),现在这个字符串是我需要为我正在构建的某个应用程序传递的密码 我尝试使用的代码是: $x = 'GIWs@K?hks2v&HKXb$S9=HK*AZN=i!(S?7' [Regex]::Escape($x) 我已经用[Regex]::Escape()尝试了该方法,但它不符合我的要求,因为我正在尝试将字符串作为密码插入,它将Regex替换为\ 也许在我执行[Regex]::Escape()之后,我应该尝试删除从命令结果中获得的\ 运行[R

我有一个字符串,其中包含一些正则表达式,
$(=?
),现在这个字符串是我需要为我正在构建的某个应用程序传递的密码

我尝试使用的代码是:

$x = 'GIWs@K?hks2v&HKXb$S9=HK*AZN=i!(S?7'
[Regex]::Escape($x)
我已经用
[Regex]::Escape()
尝试了该方法,但它不符合我的要求,因为我正在尝试将字符串作为密码插入,它将Regex替换为
\

也许在我执行
[Regex]::Escape()
之后,我应该尝试删除从命令结果中获得的
\

运行
[Regex]::Escape()
后,这是我在打印输出时得到的结果:

GIWs@K\?hks2v&HKXb=HK\*AZN=i!\(S\?7
我尝试使用转义函数实现不带“\”字符的字符串:

GIWs@K?hks2v&HKXb=HK*AZN=i!(S?7

这不是答案,因为我不知道实际问题是什么。但是,您当前处理密码字符串的尝试存在一些固有的问题。如果您使用双引号(
“”
)围绕字符串,PowerShell将在引号内插入字符串。因此,在插入过程中,未转换的
$
后面的任何字母数字字符都将被视为变量名。如果该变量没有值,
$variable
将被替换为空值。您可以在下面看到此行为:

"rt4837s$GT=\"
rt4837s=\
在引用字符串文字(保留原样的字符)时,应使用单引号(
'
)。除非存在引号嵌套,否则当遇到未替换的单引号对时,PowerShell不会尝试插值。请参阅以下内容:

'rt4837s$GT=\'
rt4837s$GT=\
如果您需要正则表达式转义字符串,上面的规则同样适用,您应该使用单引号

[regex]::escape('dfaseryh$S9=r??*')
dfaseryh\$S9=r\?\?\*
如果出于任何原因,以后需要访问该字符串而不使用转义字符,则可以使用regex方法
Unescape()


使用正则表达式替换的实际示例:

$OriginalString = 'Username = Anonymous; Password = <password>'
$regexReplace = [regex]::Escape('<password>')
$Password = 'GIWs@K?hks2v&HKXb$S9=HK*AZN=i!(S?7'

$OriginalString -replace $regexReplace,($Password -replace '\$','$$$$')
# Output 
Username = Anonymous; Password = GIWs@K?hks2v&HKXb$S9=HK*AZN=i!(S?7

请发布您试图运行的代码。这里的问题是您有一个字符串,其中包含$S9。PowerShell认为这是一个变量。因为它不是,所以会被替换为空值,从而有效地将其从字符串中删除。在字符串文本周围使用单引号:[regex]::escape('dfaseryh$S9=r4e3sdf')).PowerShell不会尝试插入
$
。我们没有上下文来提供答案。您说要使用
[regex]::escape
,但对该方法提供的转义字符不满意。然后不要使用
escape()
escape()
没有转义字符的是您的原始字符串。所以请不要弄乱它。响应者真的需要了解如何使用这个特定的正则表达式字符串来更好地帮助您。什么问题?您的代码告诉PowerShell转义正则表达式字符串中的特殊字符(即,用反斜杠在它们前面)。为什么您对PowerShell完全按照您的要求执行感到惊讶?请后退一步,描述您试图解决的实际问题,而不是您认为的解决方案。正如您在此处所写,在使用单引号“”之后,然后使用[regex]::escape您仍然得到与我试图实现的结果无关的结果,完整字符串,其中包含regex,但每个regex之前没有\。这不是regex的工作方式。如果您希望regex将正则表达式中的特殊字符视为文字字符串,则必须对其进行转义。可能您只是在需要使用regex时感到困惑例如,这里有一个regex replace的例子:
$OriginalString-replace$regexString,$NewString
。在这个例子中,只有
$regexString
是一个regex表达式。
$NewString
或替换字符串只是一个字符串。如果您正试图这样做,那么替换字符串就不需要regex。
$OriginalString = 'Username = Anonymous; Password = <password>'
$regexReplace = [regex]::Escape('<password>')
$Password = 'GIWs@K?hks2v&HKXb$S9=HK*AZN=i!(S?7'

$OriginalString -replace $regexReplace,($Password -replace '\$','$$$$')
# Output 
Username = Anonymous; Password = GIWs@K?hks2v&HKXb$S9=HK*AZN=i!(S?7
'String With Something You Want to Replace' -replace 'Regex Expression to Match String You Want to Replace','Replacement That Is a Literal String With Escaped $'