无论我觉得自己多么了解正则表达式,它们似乎总是打败我。
我正在寻找一个可以匹配任何字符串的通用模式。我唯一能弄清楚如何处理所有这些不同的命名约定的方法是制作一堆不同的正则表达式模式,现在我甚至不确定是否所有的数据都被提取了,所以我必须手动交叉检查
我只是想找出任何可能在两个括号内的东西:
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]
}
我这样做不会产生错误,但我不确定它能处理我可能遇到的所有情况。有这么多数据,手动检查几乎是不可能的。
此外,如果有人知道生成正则表达式模式的一个很好的实用程序,那将不胜感激。我只能找到regex测试程序,这对我来说不是很有用,而且在线上对使用powershell的正则表达式几乎没有帮助。
$a = [regex]"[(.*)]"
$b = $a.Match("sdfqsfsf[fghfdghdfhg]dgsdfg")
$b.Captures[0].value
匹配不是括号的所有内容。创建一个包含括号字符以外的任何字符的字符类:
$line -match "[[^[]]+]"
聚焦
我认为[.*]
就是您想要的。
解释
Sice[
和]
具有特殊用途,因此需要在这些字符之前使用.
(点)代表任何字符,*
代表前一个charector的任何重复次数
这里,前一个字符是.
,所以.*
代表任何通用字符串。
匹配两个括号之间的任何内容:
$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
--------------------------------------------------------------------------------
] ']'