修正.NET正则表达式,解决PowerShell元数据InputData匹配缺失问题
.NET正则表达式匹配PowerShell函数注释时丢失.InputData项
需求说明
提取PowerShell函数注释中的信息,规则如下:
- 信息类型(
InfoType)为句点后的第一个单词 - 若
InfoType为.InputData,则下一个单词是变量名,后续为变量描述 - 参数描述为直至下一个
InfoType前的所有文本 - 若
InfoType后无内容(如.NoRunspace),则对应值为空
当前问题
使用以下正则模式时,.InputData及其内容未被匹配:
(?m)^\s*\.(?<InfoType>(?!(Parameter)|(Outputs))\w+)\s*((?<InputVar>\w+)\s*?(?<InputComment>.*))*
待匹配文本
.Synopsis Jämför behörighetsgrupper mellan användare .MenuItem Jämför behörighetsgrupper .Description Jämför behörighetsgrupper mellan användare .SearchedItemRequest Allowed .OutputType ObjectList .InputData Användare Lista på användare, separeras med mellanslag .NoRunspace .Author Some One (Else)
当前输出
Synopsis : Jämför behörighetsgrupper mellan användare MenuItem : Jämför behörighetsgrupper Description : Jämför behörighetsgrupper mellan användare SearchedItemRequest : Allowed OutputType : ObjectList NoRunspace : Author : Some One (Else)
期望输出
Synopsis : Jämför behörighetsgrupper mellan användare MenuItem : Jämför behörighetsgrupper Description : Jämför behörighetsgrupper mellan användare SearchedItemRequest : Allowed OutputType : ObjectList NoRunspace : InputData : Användare Lista på användare, separeras med mellanslag Author : Some One (Else)
解决方案
原正则的问题是仅匹配当前行的内容,无法跨行捕获InfoType下方的描述文本。修改后的正则支持跨行匹配,直到下一个InfoType出现:
(?m)^\s*\.(?<InfoType>(?!Parameter|Outputs)\w+)\s*(?<Content>(?:\n?\s*(?!^\s*\.\w+).)*)
正则说明
(?m):启用多行模式,让^和$匹配每行的开头和结尾^\s*\.(?<InfoType>(?!Parameter|Outputs)\w+):匹配以任意空白+点开头的信息类型,排除Parameter和Outputs(?<Content>(?:\n?\s*(?!^\s*\.\w+).)*):捕获所有后续内容,包括换行和空白,直到遇到下一个以空白+点开头的InfoType为止
如果需要在正则中直接拆分.InputData的变量名和描述,可以使用分支条件:
(?m)^\s*\.(?<InfoType>(?!Parameter|Outputs)\w+)\s*(?(?=InputData)(?<InputVar>\w+)\s*(?<InputComment>.*)|(?<Content>(?:\n?\s*(?!^\s*\.\w+).)*))
效果验证
使用修改后的正则匹配待匹配文本,即可正确捕获.InputData及其内容,得到符合期望的输出结果。
内容的提问来源于stack exchange,提问作者Smorkster
相关产品推荐
相关产品推荐

