匹配非常具体的开括号和近括号

时间:2017-07-17 01:13:54

标签: regex

我正在尝试修改一些LaTeX Beamer代码,并希望快速正则表达式找到定义代码块的特定模式。例如,在

\only{
      \begin{equation*}
            \psi_{w}(B)(1-B)^{d}y_{t,w} = x^{T}_{t,w}\gamma_{w} + \eta_{w}(B)z_{t,w},
            \label{eq:gen_arima}
        \end{equation*}
    }

我想仅匹配\only{和最终},而不是其他任何内容,以便将其删除。这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

正如在这个着名的SO回答中所表达的那样,正则表达式无法计算:RegEx match open tags except XHTML self-contained tags

另外,LaTeX本身有一个相当复杂的语法(即宏扩展?)。理想情况下,您使用某种解析器,但也许这有点过分。如果您正在寻找一个非常简单,快速和肮脏的黑客,它只适用于某类投入,您可以:

  • 搜索\only
  • 每次看到counter时增加{,并在每次看到}时减少\。如果{之前有\,请忽略它。 (如果你寻找一个奇数的counter,那就很奇怪。)
  • }达到0时,您已找到结束IndexError

同样,这是不可靠

答案 1 :(得分:1)

I want to remove \only{ and }, and keep everything within it

在PCRE(php),Perl,Notepad ++上,它是这样做的:

对于像这样简单的事情,你需要的只是你 查找\\only\s*({((?:[^{}]++|(?1))*)})
替换$2

https://regex101.com/r/U3QxGa/1

解释

 \\ only \s*  
 (                             # (1 start)
      {
      (                             # (2 start), Inner core to keep
           (?:                           # Cluster group
                [^{}]++                       # Possesive, not {}
             |                              # or,
                (?1)                          # Recurse to group 1
           )*                            # End cluster, do 0 to many times
      )                             # (2 end)
      }
 )                             # (1 end)