【发布时间】:2013-07-19 21:32:41
【问题描述】:
我有一个正则表达式。它包含一个必需的命名捕获组和一些可选的命名捕获组。它捕获单个匹配项并将这些部分解析为我需要的命名组。
除了,现在我需要重复一遍。
本质上,我的正则表达式表示(可能)更长的字符串中的单个原子单元。目标字符串通常不会完全匹配我的正则表达式,而是包含重复的正则表达式实例,用点“。”分隔。字符。
例如,如果这是我的正则表达式捕获的内容:<some match>
实际的字符串可能如下所示:
<some match><some match>.<some other match><some match>.<some other match>.<yet another match>
修改原始正则表达式以考虑重复模式同时忽略点的最简单方法是什么?
我不确定它是否真的需要,但这是我用来捕获单个片段的正则表达式。同样,我想增强它以考虑可选的附加部分。我想让每个段在结果集中显示为另一个“匹配”;
^(?<member>[A-Za-z_][A-Za-z0-9_]*)(?:\[(?<index>[0-9]+)\])?(?:\[(?<index2>[0-9]+)\])?(?:\[(?<index3>[0-9]+)\])?$
它旨在解析一个类路径,最多具有三个可选的索引访问器。 (即“member.sub_member[0].sub_sub_member[0][1][2]”)
我怀疑答案涉及向前看或向后看,对此我并不完全熟悉。
我目前使用 String.Split 来分隔字符串段。但我认为如果对正则表达式的增强足够简单,我会跳过额外的拆分步骤,并重新使用正则表达式作为验证机制。
编辑:
作为齿轮中的额外扳手,我想禁止使用任何点 '.'字符串开头或结尾的字符。它们应该只作为路径段之间的分隔符存在。
【问题讨论】:
-
一种简单的方法是在
.上拆分字符串,然后在每个字符串上运行您的正则表达式。 -
我目前正在这样做。我想如果对正则表达式的增强足够简单,我就可以放弃 string.Split,还可以在解析字符串之前对其进行验证。
-
换句话说,您正在寻找从字符串的开头到结尾用点分隔的连续匹配,不是吗?
-
在大多数语言中(/“正则表达式的味道”),无法计算有多少捕获组与 * 或 + 匹配...但是,幸运的是,在 .NET 中这很容易。见:stackoverflow.com/questions/3029127/…
-
四个优秀的答案;我需要测试和消化每一种方法,以确定哪种方法最适合我。如果我能给出四个“正确答案”复选标记...