【问题标题】:regex embedded {{ matching正则表达式嵌入{{匹配
【发布时间】:2011-05-14 23:20:03
【问题描述】:

我需要匹配以下整个语句:

{{CalendarCustom|year={{{year|{{#time:Y}}}}}|month=08|float=right}}

基本上,只要有{,就需要有一个对应的},但许多嵌入的{ } 都在原始标签内。例如{{match}} 或{{ma{{tch}}}} 或{{m{{a{{t}}c}}h}}。

我现在有这个:

(\{\{.+?(:?\}\}[^\{]+?\}\}))

这不太行。

【问题讨论】:

  • 你到底想从字符串中得到什么?
  • 我只想匹配整个语句,以便删除它。就像周围有其他文本一样,我想匹配 {} 括号内的任何内容并将其删除。
  • 一般来说,正则表达式不是匹配括号的正确工具,请参阅。例如here.
  • @Howard:“正则表达式”离成为正则表达式还有很长的路要走。现代正则表达式风格提供了许多新事物,像这样的问题非常适合递归正则表达式。
  • 你可以只使用 JSON 吗?这种听起来像是你自己输出这个字符串,然后再尝试解析它。如果您确实拥有两端(并且只是序列化和反序列化),那么如果您只使用现有的解决方案,您将为自己节省大量工作;)

标签: c# regex


【解决方案1】:

.NET 正则表达式引擎允许递归匹配:

result = Regex.Match(subject,
    @"\{                   # opening {
        (?>                # now match...
           [^{}]+          # any characters except braces
        |                  # or
           \{  (?<DEPTH>)  # a {, increasing the depth counter
        |                  # or
           \}  (?<-DEPTH>) # a }, decreasing the depth counter
        )*                 # any number of times
        (?(DEPTH)(?!))     # until the depth counter is zero again
      \}                   # then match the closing }",
    RegexOptions.IgnorePatternWhitespace).Value;

【讨论】:

  • 感谢您指出这一点。今天学到了一些东西...你有链接记录&lt;DEPTH&gt;吗?
  • @Oded: DEPTH 是一个任意名称 - 它只是一个空的命名捕获组 (?&lt;id&gt;) 在 .NET 中计算匹配数; (?&lt;-id&gt;) 是一样的,只是减少了计数器。而(?(ID)(?!)) 仅在id 计数器为零时匹配。这在 Friedl 的“掌握正则表达式”的第 436 页上有记录。
  • 我尝试使用我发现的基本正则表达式解决方案,但速度非常慢。就像运行 2 分钟以上。这就像瞬间。
【解决方案2】:

我建议为此编写一个简单的解析器/标记器。

基本上,您循环遍历所有字符并开始计算{ 和} 的实例——{ 递增,} 递减。记录每个第一个{ 的索引和每个最后一个} 的索引,您将获得嵌入表达式的索引。

此时您可以使用substring 获取这些并从原始字符串中删除/替换它们。

请参阅this 问答,了解为什么 RegEx 不适合。

【讨论】:

  • 我支持这个。我曾经看到一家我曾经工作过的公司走上了通过正则表达式解析的道路,而且看起来它会变得更容易。这是一个很大的学习曲线,但从长远来看是值得的。查看 ANTLR 以获得一个起点......
  • 这是一个使用 ANTLR 解析和评估表达式的非常简单的示例。请注意,定义有效的“令牌”是多么简单,然后嵌入内联 Java 源代码(它也适用于 c#),然后由 ANTLR 完成其余的工作。 antlr.org/wiki/display/ANTLR3/Expression+evaluator
  • 我正在制作在 xbox 上运行的东西,因此不允许使用非托管代码。
  • @Paul - 你可以用 c# 写这个。
  • @Paul - 什么?循环遍历字符串中的每个字符?我描述了一个简单的算法。您认为非托管代码在哪里出现?我不是指 ANTLR。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2011-05-01
相关资源
最近更新 更多