代码之家  ›  专栏  ›  技术社区  ›  Dominic Rodger

与if cond foo else bar/if匹配的正则表达式

  •  0
  • Dominic Rodger  · 技术社区  · 16 年前

    我很难摆脱我不想要的表达方式,也很难保留我想要的表达方式。

    问题是-给定输入字符串:

    {if cond}foo{else}bar{/if}
    

    我只想:

    0: {if cond}foo{else}bar{/if}
    1: cond
    2: foo
    3: bar
    

    对于输入字符串:

    {if cond}foo{/if}
    

    我只想:

    0: {if cond}foo{else}bar{/if}
    1: cond
    2: foo
    3: 
    

    我现在买的Regex是这样的:

    \{if ([a-z0-9]+)\}([^\{]*?)(((?:\{else\})?)(.*?)?)\{/if\}
    

    我得到以下数据:

    0: {if cond}foo{else}bar{/if}
    1: cond
    2:
    3: foo{else}bar
    4:
    5: foo{else}bar
    

    这需要进一步分析 foo{else}bar 位获取各自的值。

    我的瑞格鞋在附近吗?

    我不太担心这种数据可能会被忽略,包括 { 在if语句的主体中,允许中断regex。价值观 foo bar 可以是任何不包括 { .

    谢谢,

    DOM

    4 回复  |  直到 16 年前
        1
  •  2
  •   Martin Brown    16 年前

    这个怎么样?

    \{if ([a-z0-9]+)\}([^\{]*)(?:\{else\})?([^\{]*)\{/if\}
    
        2
  •  5
  •   Diadistis    16 年前

    这应该有效:

    {if\s+([^}]*)}([^{]*)(?:{else}([^{]*))?{/if}
    

    根据你的需要逃走

        3
  •  1
  •   Adam Neal    16 年前

    Regex tester . 它使用.NET regex引擎,但它可能会派上用场。

        4
  •  0
  •   jk.    16 年前

    它是在你的问题中陈述的,但是从标签看来,你使用Boost C++库。

    也许你也有兴趣看看Boost.Spirit图书馆(包含在Boost中)。qi允许您解析复杂的数据,而语法看起来像ebnf。而伴星精神。karam则高高在上地定义输出格式,同样以ebnf格式的语法。

    使用此库,您可以从模板化文档生成AST,对其进行操作,然后生成输出文档。

    旁边 the documentation of Boost.Spirit ,有一些灰色幻灯片来自 2007 2008 我做了一个很好的介绍。