我有一个输入字符串,如下:
var format = "{0}({1:2}({*:8})){2:3}({3:16})";
对于“你这样做的目的”问题:
上面的格式告诉我们的内容与 string.Format(string, args)
方法非常相似,但进行了一些修改。
- {0} 是插入索引
- {1:2} 是指定长度(以字节为单位)的插入索引
- ({3:16}) 是分组插入索引,保留匹配序列的副本
预期输出图:
- {0}
- ({1:2}({*:8}))
- {2:3}
- ({3:16})
我现在得到的:
- {0}
- ({1:2}
- ({*:8}))
- {2:3}
- ({3:16})
我现在使用的正则表达式:
var regExpr = @"\(?\{\(*([^/}]+)\)*\}\)?";
顺便说一句,由于我刚刚学习 RegEx
,我希望得到有关表达式效率的评论。
最佳答案
对,我想我已经找到了一个解决方案 - 这可能是一个极其低效的匹配模式,但我很好奇它是否可以完成:
(((?<r>\{)|(?<-r>\})|(?<b>\()|(?<-b>\))|[^{}()]))+?(?(r)(?!))(?(b)(?!))
Working On RegexHero (.NET 正则表达式测试器)Also tested here
说明:
首先我们有(?<r>\{)|(?<-r>\})|(?<b>\()|(?<-b>\)
这些是平衡组。对于每个{
发现它将匹配添加到 r
组,然后对于每个 }
它从 r
中删除该匹配项团体。 (
也是如此。和)
在 b
组。
那么最后的交替部分就是 [^{}()]
它与其他所有内容相匹配 - 即可能出现在括号之间的任何内容。
最后我们有(?(r)(?!))(?(b)(?!))
(您也许可以使用 (?(r|b)(?!))
但它搞砸了我使用的 2 个测试仪中的 1 个的结果)。这是if..then
构造时,它检查 r
中是否有任何内容或b
组,如果有则 (?!)
- 没有任何内容的否定前瞻,总是返回 false。如果括号不平衡,这会使匹配返回 false。
自 +
交替之后是个懒人+?
它将匹配保持括号平衡的最短段。
至少在 RegexHero 上,匹配:
\1 {0}
\2 ({1:2}({*:8}))
\3 {2:3}
\4 ({3:16})
关于c# - 正则表达式忽略嵌套分隔符上的匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306871/