正则表达式模式提取花括号之间的字符串并排除花括号
Regex pattern extract string between curly braces and exclude curly braces
$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]{
和}
之间的字符串(i.e.till \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,,$match)
我不知道如何获取相关的花括号(即\add tag start { till end }
)
您可以像这样使用简单的正则表达式:
\{([\s\S]*)\}
匹配信息
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\})\}
这个怎么样:
$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]);
我有满足我要求的正则表达式。
$str = preg_replace('/\\add\s*\[.*]\s*{(.*?)\\end{(.[^\s]*?)}}/s', "\end{$2}", $str);
$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]{
和}
之间的字符串(i.e.till \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,,$match)
我不知道如何获取相关的花括号(即\add tag start { till end }
)
您可以像这样使用简单的正则表达式:
\{([\s\S]*)\}
匹配信息
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\})\}
这个怎么样:
$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]);
我有满足我要求的正则表达式。
$str = preg_replace('/\\add\s*\[.*]\s*{(.*?)\\end{(.[^\s]*?)}}/s', "\end{$2}", $str);