【问题标题】:Powershell - Remove everything but A-Z, - and space with RegexPowershell - 使用正则表达式删除除 A-Z 和空格之外的所有内容
【发布时间】:2015-11-28 02:19:22
【问题描述】:

一般来说,我对使用 powershell 和正则表达式编程还是很陌生。善良的灵魂可以向我解释为什么以下不起作用?

while($true) {
    $Name = Read-Host "Please enter your firstname and lastname"

    if($Name -match "[^a-zA-Z-]" -and $Name -match " ") {
        break;
    } else {
        Write-Host -ForegroundColor red "You didn't enter a valid name! Please try again."
    }
}

我希望我的代码继续询问 first 和 surname,只要它包含不是 a-z 和 - 的字符以及其中的空格。我在这里采取了错误的方法吗?

糟糕,应该已经提到了这个错误。我可以添加数字和特殊符号(如 >

【问题讨论】:

  • 糟糕,应该已经提到了这个错误。我可以添加数字和特殊符号(如 >
  • 不是很清楚。什么是允许和要求的。忘记什么是不允许的
  • 明确地说,您想一直询问姓名,直到 (1) 里面没有非字母字符和 (2) 里面有空格?
  • 我很确定您需要使用 `\` 转义 - 字符
  • @RNar 不在字符类的开头或结尾。

标签: regex powershell


【解决方案1】:

如前所述,您需要将 + 限定符添加到您的字符类以匹配一个或多个字符。您还需要添加一个表达式来捕获姓氏。

while($true)
{
    $Name = Read-Host "Please enter your firstname and lastname"

    if($Name -match "^[a-zA-Z-]+\s[a-zA-Z-]+$")
    {
        break;
    }
    else
    {
        Write-Host -ForegroundColor red "You didn't enter a valid name! Please try again."
    }
}

【讨论】:

  • 非常感谢您帮助我理解这一点并解决了我的问题!
【解决方案2】:

如果你想匹配一个只有小写和大写拉丁字符和连字符的字符串,这就是你想要的:

^[a-z -]+$

如果要防止连续出现多个空格,则必须做一些更复杂的事情:

^(?:[a-z-]+ ?)+$

虽然我并不像我想象的那样熟悉 Bash,所以这可能并不完全准确。

你有什么检查是否有任何字符不在该字符类中(因为你用 ^ 否定它),并且只有在这种情况下才返回 true。

【讨论】:

  • 仅供参考-match,以及相关的正则表达式比较运算符,默认情况下不区分大小写。最后一部分对于 PowerShell 来说也不是有效的语法
  • @Matt 哎呀。我可能应该回到使用 Unix 并练习一下。
  • 有了这个,一旦字符串中至少有一个字母字符或连字符和一个空格,它仍然存在while循环,这意味着它仍然接受我的$Name字符串,如果它是“Erik \^”跨度>
  • @ErikJ 嗯,然后-match 的工作方式与我的想法相反。我将对其进行编辑以使其正常工作。
  • ^(?:[a-z -]+ ?)+$ 将允许多个空格以及两个以上的名称。
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 2018-05-26
  • 2019-04-15
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多