c# - 正则表达式忽略嵌套分隔符上的匹配

标签 c# .net regex

我有一个输入字符串,如下:

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/

相关文章:

c# - 连接字符串 : is it the right form?

c# - SQLite 的 DLL hell

.net - 从 .net 中的 xsd 架构文件中提取枚举值

regex - 如何使用 Spark 解析可能跨越多行的日志行

c# - 如何从工具窗口访问当前代码编辑器?

c# - 具有并发任务的单实例 WCF 服务(可以限制)

c# - 如何将动态对象序列化为xml C#

html - 使我的 DIV 响应

regex - 有没有办法在正则表达式中插入变量?

regex - 为什么这个正则表达式匹配返回一个 HashMap ?