grep和有效的括号序列

时间:2016-09-20 13:26:34

标签: regex grep

我需要从我的latex文件中提取所有索引。但是一些指数可能看起来像这样

  

\ {指数* 3 * SQRT * uppersqrt {\ HSPACE {-2.5pt} $ \ uppersqrt {\; \; \;} $(上   平方根)}}

所以我需要以某种方式计算当前打开的花括号的正则表达式数。我不知道如何处理这种情况。

此外,如果索引包含/,那么我不需要这样的索引。

示例:

Anything before. \index{{}{}}\index{Hi}\anothertag{something}
\index{}{}
\index{/}

预期结果是

\index{{}{}}
\index{Hi}
\index{}

2 个答案:

答案 0 :(得分:0)

可以打开数量有限的括号吗? 正则表达式

\\index{(?:[^{]|(?:{(?:[^{]|(?:{[^{]*}))*}))*}

最多匹配3个括号,例如:\ index {{{}} {{}}}

答案 1 :(得分:0)

正则表达式:

\\index({(?(?!{|})[^\/{}]*|(?1))*})

Live demo

说明:

\\index             # Match `\index` literally
(                   # Start of capturing group (1)
    {                   # Match opening brace `{`
    (?                  # Start of conditional statement
        (?!{|})             # If very next immediate character is not `{` or `}`
        [^\/{}]*            # Anything except these characters
        |                   # Else
        (?1)                # Recurs capturing group (1)
    )*                  # End of conditional - repeat conditional zero or more times - greedily.
    }                   # Match closing brace `}`
)                   # End of capturing group (1)

用法:

grep -Po "\\index({(?(?!{|})[^\/{}]*|(?1))*})" input_file.txt

根据OP提供的输入输出:

\index{{}{}}
\index{Hi}
\index{}