正则表达式模式提取花括号之间的字符串并排除花括号

时间:2015-03-06 13:43:46

标签: php regex preg-replace

$str='\add[sometext]{\begin{equation}\label{eqn:3}
f_{1} =
\begin{cases}}
\beta_{1} + \beta_{2}f_{2} & f_{2}\leq \gamma\\
\beta_{1} + \beta_{2}\gamma + \beta_{4}(f_{2}-\gamma) & f_{2} >\gamma
\end{cases}sdsdssd,
\end{equation}}
 it may have some extra code here with {}
 \end{equation}}'

我需要在\add[sometext]{}之间提取字符串(ietill \ add tag end curly braces)\add[sometext]{}之间的字符串可能会有所不同,所以我可以在正则表达式模式中指定这些字符串我应该只考虑\add[sometext]

的开始和结束花括号

预期产出:

\begin{equation}\label{eqn:3}
    f_{1} =
    \begin{cases}
    \beta_{1} + \beta_{2}f_{2} & f_{2}\leq \gamma\\
    \beta_{1} + \beta_{2}\gamma + \beta_{4}(f_{2}-\gamma) & f_{2} >\gamma
    \end{cases}sdsdssd,
    \end{equation}

我试过了:

$str=preg_replace('/\\\\add\s*\[\s*\w*\]\s*{(.*?)}/s,$1,$match)

我不知道如何获得相关的大括号(即\add tag start { till end }

3 个答案:

答案 0 :(得分:1)

您可以使用这样的简单正则表达式:

\{([\s\S]*)\}

Regular expression visualization

<强> Working demo

enter image description here

匹配信息

MATCH 1
1.  [21-226]    `\begin{equation}\label{eqn:3}
f_{1} =
\begin{cases}}
\beta_{1} + \beta_{2}f_{2} & f_{2}\leq \gamma\\
\beta_{1} + \beta_{2}\gamma + \beta_{4}(f_{2}-\gamma) & f_{2} >\gamma
\end{cases}sdsdssd,
\end{equation}`

正如您在匹配信息中所看到的,捕获的内容就是您所需要的。

这个正则表达式背后的想法是

\{([\s\S]*)\}
      ^--- Capture everything in a greedy way from the first `{` to the last `}`

但如果你使用s标志(单行),你也可以做同样的事情:

(?s)\{(.*)\} --> using inline `s` flag
    \{(.*)\} --> using external `s` flag

对于PHP代码,您可以:

$re = "@\\{(.*)\\}@s"; 
$str = "\$str='\add[sometext]{\begin{equation}\label{eqn:3}\nf_{1} =\n\begin{cases}}\n\beta_{1} + \beta_{2}f_{2} & f_{2}\leq \gamma\\\n\beta_{1} + \beta_{2}\gamma + \beta_{4}(f_{2}-\gamma) & f_{2} >\gamma\n\end{cases}sdsdssd,\n\end{equation}}'"; 

preg_match($re, $str, $matches);

<强>更新

您可以将此正则表达式用于问题中的更新评论:

\{([\s\S]*equation\})\}

<强> Working demo

答案 1 :(得分:1)

怎么样:

$str='\add[sometext]{\begin{equation}\label{eqn:3}
f_{1} =
\begin{cases}
\beta_{1} + \beta_{2}f_{2} & f_{2}\leq \gamma\\
\beta_{1} + \beta_{2}\gamma + \beta_{4}(f_{2}-\gamma) & f_{2} >\gamma
\end{cases}sdsdssd,
\end{equation}}';

$str= preg_match('/\\\\add\s*\[\s*\w*\]\s*{(.*?)}$/s',$str,$match);

var_dump($match[1]);

答案 2 :(得分:0)

我有一个正则表达式符合我的要求。

$str = preg_replace('/\\\\add\s*\[.*]\s*{(.*?)\\\\end{(.[^\s]*?)}}/s', "$1\\end{\$2}", $str);

Working demo