尝试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
如果你有这样的递归模式,上面的模式将不起作用
(i want(to) (extract and also (this)) this text)
------
-------------------------
在这种情况下,您可以按照elclanrs的建议使用recursive pattern
你也可以通过保持(和)的数量计数而不使用正则表达式来做到这一点
所以,
假设noOfLB是计数(并且noOfRB是计数)
>继续迭代字符串中的每个字符并保持第一个位置(
>如果找到,则增加noOfLB(
>如果你发现,增加noOfRB)
>如果noOfLB == noOfRB,你找到了最后一个位置)
我不知道php所以我会在c#上面实现algo
public static string getFirstRecursivePattern(string input)
{
int firstB=input.IndexOf("("),noOfLB=0,noOfRB=0;
for(int i=firstB;i=0;i++)
{
if(input[i]=='(')noOfLB++;
if(input[i]==')')noOfRB++;
if(noOfLB==noOfRB)return input.Substring(firstB,i-firstB+1);
}
return "";
}
标签:php,regex
来源: https://codeday.me/bug/20190725/1533929.html