17

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

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

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

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 的正则表达式在线帮助很少。

4

4 回答 4

21
$a = [regex]"\[(.*)\]"
$b = $a.Match("sdfqsfsf[fghfdghdfhg]dgsdfg") 
$b.Captures[0].value
于 2013-08-01T18:14:30.900 回答
7

匹配所有不是括号的东西。创建一个包含除括号字符以外的任何内容的字符类:

$line -match "\[[^\[\]]+\]"
于 2013-08-01T19:20:23.850 回答
2

专注于

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

我想\[.*\]这就是你要找的。

解释
Sice[]特殊用途,所以需要\在那些字符之前使用。
.(点)代表任意字符,
*代表前一个字符的任意重复次数。
在这里,前一个字符是.,所以.*代表任何通用字符串。

于 2016-05-23T15:48:52.023 回答
0

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

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

请参阅正则表达式证明结果

[b]
[d text]

解释

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

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

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

请参阅正则表达式证明解释

--------------------------------------------------------------------------------
  \[                       '['
--------------------------------------------------------------------------------
  (?>                      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
--------------------------------------------------------------------------------
  ]                        ']'
于 2021-09-19T20:55:51.133 回答