【问题标题】:Regex Match any string powershell正则表达式匹配任何字符串powershell
【发布时间】:2013-08-02 18:31:09
【问题描述】:

无论我觉得我知道正则表达式有多好,它们似乎总是打败我。

我正在寻找可以匹配任何字符串的通用模式。我能弄清楚如何处理所有这些不同的命名约定的唯一方法是制作一堆不同的正则表达式模式,现在我什至不确定是否所有数据都被拾取,所以我必须手动交叉检查它。

我只是想找出可能在两个括号 [] 内的任何内容:

elseif($line -match "\[\w*\d*\]") {         
    $pars = $matches[0]
}
elseif($line -match "\[\d*\w*\]") {
    $pars = $matches[0]
}
elseif($line -match "\[\w*\d*_\w*\]") {
    $pars = $matches[0]
}
elseif($line -match "\[\w*\d*_*\w*-*\w*:*\w*\]") {
    $pars = $matches[0]
}            
elseif($line -match "\[\w*_*\w*_*\w*_*\w*_*\w*_*\w*-*\w*\]") {
    $pars = $matches[0]
}

我这样做的方式不会产生错误,但我不确定它是否能处理我可能遇到的所有情况。对于这么多数据,手动检查几乎是不可能的。

此外,如果有人知道生成正则表达式模式的强大实用程序,将不胜感激。我只能找到对我来说不是很有用的正则表达式测试器,并且对于使用 powershell 的正则表达式在线帮助很少。

【问题讨论】:

  • 任何字符串是什么意思?这是否意味着正则表达式.+ 会做?顺便说一句,\d_ 已经包含在 \w
  • 您并没有很好地描述您要在括号内匹配的内容。从我可以从你的代码中推断出来,你正在寻找任何只有字母数字字符和下划线的字符串。如果是这种情况,您可以使用\[[\d\w]*\]\[[a-zA-Z_0-9]*\]....哦,我也看到了冒号和破折号。好吧,在这种情况下你可以做\[[\w\d:-]*\]
  • Angga 明白了。任何字符串我的意思是“你可以放在两个括号之间的任何可能的字符”。 .+ 正好处理这个问题。谢谢,发布您的解决方案,以便我可以接受它作为答案
  • @Cole9350 最好用这些信息更新问题。
  • @PeterMortensen 请不要使用您的自动化软件来编辑我的问题/答案。编辑没有用,也没有意义。维基百科不是您建议的更改的有效站点来源。

标签: regex parsing powershell match


【解决方案1】:

匹配两个括号之间的任何内容:

$text='[a[b]c] and [d text]'
$p = [regex]'\[[^][]*]'
$p.Matches($text) | % {Write-Host $_.value}

regex proof结果

[b]
[d text]

解释

--------------------------------------------------------------------------------
  \[                       '['
--------------------------------------------------------------------------------
  [^][]*                   any character except: ']', '[' (0 or more
                           times (matching the most amount possible))
--------------------------------------------------------------------------------
  ]                        ']'

如果括号需要成对并且可以嵌套:

\[(?>[^][]+|(?<g>)\[|(?<-g>)])*]

regex proof解释

--------------------------------------------------------------------------------
  \[                       '['
--------------------------------------------------------------------------------
  (?>                      match (and do not backtrack afterwards) (0
                           or more times (matching the most amount
                           possible)):
--------------------------------------------------------------------------------
    [^][]+                   any character except: ']', '[' (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
  (?<g>)\[                '[' (empty match added to "g" group stack)
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
  (?<-g>)]                ']' (empty match removed from "g" group stack)
--------------------------------------------------------------------------------
  )*                       end of look-ahead
--------------------------------------------------------------------------------
  ]                        ']'

【讨论】:

    【解决方案2】:

    专注于

    “我只是想挑选任何可能在两个括号 [] 内的东西”

    我认为 \[.*\] 是您正在寻找的。

    说明
    Sice [] 有特殊用途,因此您需要在这些字符之前使用\
    .(dot) 代表任意字符,
    * 代表前一个字符的任意重复次数。
    这里,前一个字符是 .,所以 .* 代表任何通用字符串。

    【讨论】:

      【解决方案3】:
      $a = [regex]"\[(.*)\]"
      $b = $a.Match("sdfqsfsf[fghfdghdfhg]dgsdfg") 
      $b.Captures[0].value
      

      【讨论】:

      • 完美,这和.+ 一样有效,这让我弄清楚贪婪和不贪婪之间的区别。非常感谢。
      • 对不起,我不明白你的问题?
      • 如果一个字符串包含多个 ] 会发生什么,例如“asdfasfd[asdf]sfafe]asdfs”?如何在 [..] 中获取“asdf”?
      • 使用$a.Matches() 而不是Match() 来返回多个结果 - Match() 似乎找到一个然后停止
      • @David.Chu.ca, $a = [regex]"\[([^\[\]]*)\]" 将阻止它与第二个 ] 匹配
      【解决方案4】:

      匹配所有不是括号的东西。创建一个不包含括号字符的字符类:

      $line -match "\[[^\[\]]+\]"
      

      【讨论】:

        猜你喜欢
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 2013-12-25
        • 1970-01-01
        相关资源
        最近更新 更多