【问题标题】:Regex pattern extract string between curly braces and exclude curly braces正则表达式模式提取花括号之间的字符串并排除花括号
【发布时间】:2015-03-06 13:43:46
【问题描述】:
$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 大括号)\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 }

【问题讨论】:

    标签: php regex preg-replace


    【解决方案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】:

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

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

    Working demo

    比赛信息

    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);
    

    更新:

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

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

    Working demo

    【讨论】:

    • 感谢您的回答。它不能解决问题。如果字符串是\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}} and some extra code here}} or },它会捕获到最后一个花括号。我需要直到\add tag starting { to ending }
    • @Vidhya 如果您查看屏幕截图,您可以看到绿色突出显示它捕获了您的预期输出
    • 我已经更新了帖子。该字符串可能有许多花括号。所以我只需要得到\add tag related curly braces
    • @Vidhya 改用这个正则表达式 working demo
    • 实际上对于我的帖子来说,这将是正确的解决方案。我的目标是在相关的花括号之间获取字符串,因为equation} 可能会有所不同。它可能是align},所以我不能指定equation 字符串,如果我的字符串中有另一个equation},它也会捕获它。所以你能告诉我如何开始\add[]tag 的花括号和结束花括号只有这样才能避免这些限制
    【解决方案3】:

    我有一个正则表达式来满足我的要求。

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

    Working demo

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多