使用.NET正则表达式查找所有特殊标记
使用正则表达式,我需要收集有效的顶级令牌使用.NET正则表达式查找所有特殊标记,.net,regex,vb.net,string-formatting,.net,Regex,Vb.net,String Formatting,使用正则表达式,我需要收集有效的顶级令牌{…},并忽略带引号的字符串“…”(包括可能的“)内的令牌边界 简化样本: TEXT{bbbbb}TEXT{cccc{dddddd}TEXT{eeee{ff{gg}hh}ii{jj}“kk}{ll”“mm{nn}”oo{pppp}TEXT 预计有3个匹配项: {bbbbb} {cccc{dddddd} {eeee{ff{gg}hh{ii{jj}“kk}{ll”“mm{nn}”oo{pppp} 请注意,忽略字符串“kk}{{{}ll”“mm{nn}”的内容
{…}
,并忽略带引号的字符串“…”
(包括可能的“
)内的令牌边界
简化样本:
TEXT{bbbbb}TEXT{cccc{dddddd}TEXT{eeee{ff{gg}hh}ii{jj}“kk}{ll”“mm{nn}”oo{pppp}TEXT
预计有3个匹配项:
{bbbbb}
{cccc{dddddd}
{eeee{ff{gg}hh{ii{jj}“kk}{ll”“mm{nn}”oo{pppp}
请注意,忽略字符串
“kk}{{{}ll”“mm{nn}”
的内容'{'[a1]['|'[a2| c1]('='|''''')c2]['|'c3['|'c4]]]}'
其中,aX
是简单的正则表达式((,-?\d+(:*):*)
)和cX
可以包含匹配的{
-}
,纯文本和字符串“…”
,其中的特殊字符如{/code>,
,
,
被视为纯文本
我不理解这个正则表达式中需要的平衡和逃逸。对于相对初学者来说可能太难了
其他详情:
我已经完成了部分解决方案,我的问题是平衡和引用
我正在尝试将输入中包含的扩展标记创建为字符串,该字符串类似于,但也允许条件计算。例如,在文件名模板中使用这些标记,用户可以在批处理中配置文件名的自定义部分。标记具有字母数字名称和格式部分(包括可选条件、真部分和假部分)。格式化部分可以是:
- “本机格式”-如
String.format()
所述,但使用字母数字名称代替占位符{0}
,{1}
,{2}
,…
正则表达式是(,-?\d+(:.*)?:.*)
.
示例:
,3
(转换为标准{0,3}
)
:d
(转换为标准{0:d}
)
-3:d
(转换为标准{0,-3:d}
)
- “复杂格式”-本机格式,
或者使用固定的文本{0}
作为字符串..{0}…
正则表达式是:”(“
&nativeFormatSpec&”|*({0.*}.*)”
.
示例:
-4:d
(仅本机格式)
前缀{0,-4:d}&再次将{0}后缀
转换为
..String.Format(“prefix{0,-4:d}”和}}}一次“more{0}后缀”,value)
现在,有效令牌的整个语法是:
'{'[quickFormat]['|'[complexFmt1]('='|''')值][complexFmt2 |[complexFmt3]]'}'
我的代码使用了许多命名组,但正则表达式可能太简单了:
”***匹配令牌名称(稍后用作match.Group(groupName))
Const tokenGroup As String=NameOf(tokenGroup)
Const compareFormatGroup As String=NameOf(compareFormatGroup)
常量quickFormatGroup As String=NameOf(quickFormatGroup)
常量compareOperatorGroup As String=NameOf(compareOperatorGroup)
Const compareValueGroup As String=NameOf(compareValueGroup)
Const defaultFormatGroup As String=NameOf(defaultFormatGroup)
常量elseFormatGroup As String=NameOf(elseFormatGroup)
'***子模式
Const nativeFormatSpec As String=“(,-?\d+(:.*));:.*”
Const complexFormatSpec As String=“(”&nativeFormatSpec&“|.*({0.}.*))”值允许一个标记{0}多次
Dim matches As MatchCollection=Regex.matches(输入,
$“\{{(?{Regex.Escape(token)})({nativeFormatSpec}?”&
$“(\\\;(?{complexFormatSpec}))?(?=!=?)(?*)”&
$“(\\\;(?{complexFormatSpec})(\\\\;({complexFormatSpec}))?)?\}”)
根据您的简化数据,以下是处理提取的正则表达式:
\{(?>(?:"[^"]*(?:""[^"]*)*"|[^{}]+)|\{(?<n>)|\}(?<-n>))*(?(n)(?!))\}
\{(?>(?:“[^”]*(?:“[^”]*)*“[^{}]+)\{(?)\{(?)\{(?)*(?(n)(?!)\}
看
这基本上是一个平衡的大括号正则表达式,与类似VB.NET的字符串文字匹配正则表达式“[^”]*(?:“[^”]*)*”
。请注意,在查找成对大括号(带引号的字符串和非大括号)时,实际上忽略了这一部分-(?:“[^”]*(?:“[^”]+)
.对于此类数据,您最好使用自定义解析器。@Shar1er80–了解正则表达式,我知道它仍然在其合理范围内,因为语法中没有任何奇怪之处。我只是需要在这方面有更多技能的人的帮助。答案中显示的解决方案简单有效。非常感谢&+1。在样本,我已经忘记了忽略问题字符的功能,忘记了忽略问题字符的功能,忘记了样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我忘记了功能,忘记了忽略问题字符的功能,忽略了问题字符的功能,有问题字符<代码,代码,代码,我的样本,我的忘忘了功能,有问题字符<代码,有问题字符<代码,代码,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的忘了功能,忘记了功能,忘记了功能,忘记了功能,忽略了了有有问题字符,有问题字符<代码,有问题字符<代码,有问题字符<代码<<<代码,代码,代码,代码,代码<<<<代码<代码,代码,代码,代码,代码,代码,代码,代码,代码,代码,代码,代码,我的样本,我}ll“mm{nn}”oo{pppp}TEXT}{{pppp}{TEXT
(预期与之前的3次相同。)我试图增强您的正则表达式,但我找不到如何添加上述忽略引用内容的部分。我可以向您寻求其他帮助吗?如果您愿意,我还可以为其发布单独的问题。.使用.Groups(1).Value
。谢谢,我正在从中学习。更新的正则表达式实际上与添加的引用部分匹配,而不是忽略它们,但是,当以编程方式检查匹配时,很容易忽略它们。这种方法是有效解决这类问题的常用方法之一吗?(现在我看到您对组(1)的编辑).Value
。它回答了:)
)匹配和不捕获您不需要的内容,以及匹配和捕获您需要的内容是一种有效的正则表达式技术,如中所述。