【问题标题】:Strange behavior for PowerShell string matchPowerShell 字符串匹配的奇怪行为
【发布时间】:2018-06-13 11:00:36
【问题描述】:

当我在 PowerShell 中编写此代码时,

$Person ="Guy Thomas 1949bhau"
$Person -Match "19?9"

它返回真。

但是当我在 PowerShell 中编写这个时,

$Person ="Guy Thomas 1949bhau"
$Person -Match "19?9bhau"

它返回 false。

这种奇怪行为的原因是什么?首先它是如何返回 true 的?

【问题讨论】:

  • -match 使用正则表达式。 ? 表示前面的 0 或 1 个字符。
  • 您正在寻找的是-likeDocumentation
  • 因为字符串中存在序列19。它正在根据您的匹配查询寻找 19919
  • @TheIncorrigible1 理解我的错误接受以下答案

标签: string powershell match


【解决方案1】:

这种行为没有什么奇怪的。 -match operator 匹配 regular expression。在正则表达式中,? 是一个特殊字符,其含义是“前一个表达式的零次或多次”。因此,(常规)表达式19?9 表示“一个后跟零个或多个九和另一个九”(匹配19199199919999 等)。要精确匹配一个任意字符,您需要使用.。但是,在您的情况下,您可能想要匹配一个数字(\d[0-9]),而不仅仅是任何字符。

如果您想使用通配符匹配(其中? 表示“任何单个字符”,* 表示“零个或多个字符”),您需要使用-like 运算符。但请注意,虽然 -match 运算符匹配字符串中任何位置的模式(除非模式被锚定),但 -like 运算符隐式地将表达式锚定在字符串的开头和结尾,除非您将 * 放在模式的开始和/或结束。 -like '19?9' 匹配例如“1979”和“19m9”,但不匹配“a1979”或“1979a”。为此,您需要-like '*19?9*'

【讨论】:

    【解决方案2】:

    或者这些选项...

    $Person ="Guy Thomas 1949bhau"
    $Pattern = '19?.*9'
    (((Select-String -InputObject $Person -Pattern $Pattern -AllMatches).Matches).Value)
    
    Results
    
    1949
    
    $Person ="Guy Thomas 1949bhau"
    $Pattern = '19?.*9*'
    (((Select-String -InputObject $Person -Pattern $Pattern -AllMatches).Matches).Value)
    
    Resutls 
    
    1949bhau
    

    或者

    [regex]::Matches($Person,$Pattern)
    
    Results 
    
    Groups   : {0}
    Success  : True
    Name     : 0
    Captures : {0}
    Index    : 11
    Length   : 8
    Value    : 1949bhau
    

    或者

    [regex]::Matches($Person,$Pattern).Value
    
    Results
    
    1949bhau
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2023-03-20
      相关资源
      最近更新 更多