背景:正则表达式的难题 - PowerShell的(.NET正则表达式引擎)
我有我用来处理一些XML文件的PowerShell脚本。这些XML文件嵌入了'令牌'和'过滤器'。令牌在我的脚本中得到解决,并且过滤器应用于解析之前令牌评估的值。
令牌定义如下:{!#T#TokenName#T#}
筛选器等被定义:{!#F#FILTERNAME#F#}
一些令牌和过滤器有'参数',所有参数都在它们自己的参数标记中,ALL参数s必须明确命名,3平等字符单独的参数名称和参数值:{!,#P#PARAMNAME === ParamValue,#P#}
例如,下面的 'REGVAL'代币有两个参数'RegKey'和'Name':
{!#T#RegVal {!#P#RegKey === RegKeyPath#P#!} {!#P#Name === RegValName #P #!}#T#!}
的问题
我已经得到了处理标记和过滤器与参数(我已经提取从封闭的XML标记之后的字符串)一个工作系统。我首先使用正则表达式来识别单个令牌,如下所示。
(?si){!#T#((?:(?!{!#T#.*#T#!}).)*)#T#!}
...问题是我现在要嵌入其他标记内的标记,如:!!!
{#T#ContainingToken {P | PARAMNAME === {#ŧ #RegVal {P | REGKEY === HKLM:!\ SOFTWARE \密押,#P#} {!,#P#名称===的TestEntry,#P#}!#T#},#P#}#T# !}
上面的正则表达式不适合,我不是正则表达式的专家,我做了上面的正则表达式的麻烦,所以现在是时候寻求帮助。
我认为这将是可能的调整正则表达式?以下限制是完全可以接受的:
-embedding只有一个深。
参数值内-only嵌入(如此后:===)的参数来揭示
-a第二遍中包含的任何令牌和过滤器。
对于裁判这里是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...
http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html –
@DavidBrabant谢谢,我当然不记得在大学里被教授乔姆斯基层次结构。我将不得不考虑替代正则表达式。 – Darren