正则表达式难题-PowerShell(.NET正则表达式引擎)
背景: 我有一个PowerShell脚本,用于处理一些XML文件。这些XML文件嵌入了“标记”和“过滤器”。令牌在我的脚本中得到解析,过滤器应用于前面令牌计算的解析值 令牌的定义如下: {!#T#TokenName#T#!} 过滤器的定义如下: {!#F#过滤器名称#F#!} 一些令牌和筛选器具有“参数”,所有参数都在其自己的参数标记中,并且所有参数都必须显式命名,三个相等字符将参数名称和参数值分开: {!#p#ParamName==ParamValue#p#!} 例如,以下“RegVal”标记有两个参数“RegKey”和“Name”: {!#T#RegVal{!#p#RegKey===RegKeyPath#p#!}{!#p#Name==RegValName#p#!}正则表达式难题-PowerShell(.NET正则表达式引擎),.net,regex,powershell,.net,Regex,Powershell,背景: 我有一个PowerShell脚本,用于处理一些XML文件。这些XML文件嵌入了“标记”和“过滤器”。令牌在我的脚本中得到解析,过滤器应用于前面令牌计算的解析值 令牌的定义如下: {!#T#TokenName#T#!} 过滤器的定义如下: {!#F#过滤器名称#F#!} 一些令牌和筛选器具有“参数”,所有参数都在其自己的参数标记中,并且所有参数都必须显式命名,三个相等字符将参数名称和参数值分开: {!#p#ParamName==ParamValue#p#!} 例如,以下“RegVal”标记
问题 我已经有了一个工作系统来处理令牌和带有参数的过滤器(在我从封装的XML标记中提取了一个字符串之后)。我首先用正则表达式标识各个令牌,如下所示
(?si){!#T#((?:(?!{!#T#.*#T#!}).)*)#T#!}
…问题是我现在想在其他令牌中嵌入令牌,例如:
{!#T#ContainingToken{!#p#ParamName=={!#T#RegVal{!#p#RegKey==HKLM:\SOFTWARE\TestKey#p##p#Name==TestEntry#p###T#T#T#
上面的正则表达式不合适,我不是正则表达式专家,我在做上面的正则表达式时遇到了很多麻烦,所以是时候寻求帮助了
我认为这将是可能的调整正则表达式?以下限值完全可以接受:
-只嵌入一个深度
-仅嵌入参数值内(因此在:==)
-第二次传递参数以显示任何包含的令牌和筛选器
对于ref,这里是PowerShell片段:
function Get-Matches($pattern)
{
begin {
Try {
$regex = New-Object Regex($pattern)
}
Catch {
Throw "Get-Matches: Pattern not correct. '$pattern' is not a valid regular expression."
}
}
process {
foreach ($match in ($regex.Matches($_)))
{
([Object[]]$match.Groups)[-1].Value
}
}
}
function Get-ParsedInput([String] $rawValue)
{
$intermediateValue = $rawValue
$tokenMatches = @($intermediateValue | Get-Matches '(?si){!#T#((?:(?!{!#T#.*#T#!}).)*)#T#!}') # Wrapped as array...
if ($tokenMatches.Count -gt 0)
{
$i=1
$tokens = @{ }
foreach ($tokenTextWithParms in $tokenMatches)
{
# ...from here I instantiate new token instance...
至于嵌套模式——一般来说,正则表达式不是用于嵌套模式的工具,因为它们源自无法处理“计数”的语法。但是在.NET中(因此在PowerShell中也是如此)这是可能的。看一看。可能还有其他来源,但这是我第一次浏览。基于本文最后一个例子 我的结局是: (?x) {!#T# ( (?> (?!{!#T#|#T##!})。 | {!#T#(?) | #T#!}(?) )* (?(深度)(?!) ) ##!}
…似乎足够有效,但目前还不是100%有效 @DavidBrabant谢谢,我当然不记得在大学里被教过乔姆斯基等级制度。我将不得不考虑regex的替代方案。谢谢,一旦我能走出嘈杂的办公室,你的链接和这个链接应该是我需要解决的全部问题。