与ISE相比,正则表达式在控制台中表现不同

时间:2016-04-25 12:26:00

标签: regex powershell

我在制作“互动”时遇到了一种奇怪的行为。 PS脚本。 启动时,脚本需要用户请求的信息。我使用正则表达式来评估结果,但其中一个失败了:

$a = ""
while (!$a)
{
    Write-Host "`nSome text to instruct the user:"
    $Global:a = Read-Host
    if($a -notmatch "a1[a-z,A-Z]{6}$")
    {
        Write-Host "no match!"
    }
    else {Write-Host "match"}
    }

程序等待以' a1'开头的字符串。接着是6个字母。

当我从ISE运行此代码段时,它可以正常工作。提供测试值a1szvite它返回“匹配”,然而当我将其保存为独立脚本并在普通的PowerShell窗口中运行时,它返回“没有匹配!”#39;和继续要求另一个值,表明由于某种原因$a没有写入数据。

所有其他正则表达式都像魅力一样,我对这里的问题感到有些困惑。具有相同馈送值的相同代码行如何返回不同的结果?

我真的认为这是我的一些小错误,我只是不知道它在哪里。

提前致谢!

1 个答案:

答案 0 :(得分:2)

我已对此进行测试,并获得与您相同的结果。为了帮助解释我的发现,我在您的脚本中添加了以下行。

write-host "$a" -ForegroundColor Yellow
write-host "$Global:a" -ForegroundColor Red
当脚本在ISE之外运行时,

$global:a$a是不同的变量。作为Frode F. mentions in comments,脚本具有自己的范围,因此$a是脚本的本地脚本。您收集使用输入的行是在全局范围内定义另一个名为$a

的变量

当我在ISE之外运行您的脚本时,我只会收到红色文本,告诉我您的-notmatch正在检查$a的原始空值。这证明了范围问题。

从第$Global:a = Read-Host行移除范围修饰符,并将其更改为$a = Read-Host。这样所有行都引用相同的变量。

旁注:我会将您的正则表达式字符串更新为^a1[a-z]{6}$匹配运算符,而大多数其他字符串不区分大小写,以便匹配大写和小写。另外你提到字符串必须以a1开头,所以使用行锚的开头会强制执行。