gpt4 book ai didi

php - 正则表达式获取括号之间有文本的括号之间的文本

转载 作者:可可西里 更新时间:2023-11-01 00:14:41 26 4
gpt4 key购买 nike

在尝试重写这个问题 10 次后被接受,我有一个小文本,括号之间有文本,我想提取该文本,所以我写了这个表达式:

/(\([^\)]+\))/i

但这只会提取第一个 ( 和最后一个 ) 之间的文本,忽略其余文本那么有什么方法可以提取全文,例如:

i want(to) extract this text

来自:

this is the text that (i want(to) extract this text) from

可能有不止一个括号括起来的子文本。

谢谢

编辑发现这个:

preg_match_all("/\((([^()]*|(?R))*)\)/", $rejoin, $matches);

接受的答案中提供的链接非常有用

最佳答案

是的,你可以使用这个模式

   v                   v
(\([^\)\(]*)+([^\)\(]*\))+
------------ -------------
| |
| |->match all (right)brackets to the right..
|
|->match all (left)brackets to the left

Demo


如果你有这样的递归模式,上面的模式将不起作用

(i want(to) (extract and also (this)) this text)
------
-------------------------

在这种情况下,您可以使用 recursive pattern根据 elclanrs 的推荐


您也可以在不的情况下通过维护()的数量来使用正则表达式来做到这一点

所以,假设 noOfLB 的计数(noOfRB 的计数)

  • 继续迭代字符串中的每个字符并保持first的位置 (
  • 如果找到 (
  • 如果找到则增加 noOfRB )
  • 如果noOfLB==noOfRB,你已经找到了last )的最后位置

我不懂 php,所以我会用 c# 实现上面的算法

public static string getFirstRecursivePattern(string input)
{
int firstB=input.IndexOf("("),noOfLB=0,noOfRB=0;
for(int i=firstB;i<input.Length && i>=0;i++)
{
if(input[i]=='(')noOfLB++;
if(input[i]==')')noOfRB++;
if(noOfLB==noOfRB)return input.Substring(firstB,i-firstB+1);
}
return "";
}

关于php - 正则表达式获取括号之间有文本的括号之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17439138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com