假设我有一个文档,我想要捕获之前或之后有括号的字符串。如何获取任意数目的括号之间的文本?
例子:This [is] a {{test}} sentence. The (((end))).
所以基本上我想要得到的话is
,test
和end
。
在此先感谢。
假设我有一个文档,我想要捕获之前或之后有括号的字符串。如何获取任意数目的括号之间的文本?
例子:This [is] a {{test}} sentence. The (((end))).
所以基本上我想要得到的话is
,test
和end
。
在此先感谢。
根据您的病情“字符串后或之前有括号” - 任何字都可以用OR或者仅仅跟在某种类型的圆括号之后:
$text = 'This [is] a {{test}} sentence. The (((end))). Some word))';
preg_match_all('/(?:\[+|\{+|\(+)(\w+)|(\w+)(?:\]+|\}+|\)+)/', $text, $m);
$result = array_filter(array_merge($m[1],$m[2]));
print_r($result);
输出:
Array
(
[0] => is
[1] => test
[2] => end
[7] => word
)
问题是:应该关闭符号匹配开头的吗?如何处理“{{test}}”?是匹配'测试'还是'测试')?你的正则表达式给出'测试'的结果,这是 - 不要误解我 - 没有错。 OP不清楚。 –
@mlambrichs。再次阅读来自问题的描述*在**之前有括号的字符串**在**之后* – RomanPerekhrest
你的正则表达式可能是:
[\[{(]((?(?<=\[)[^\[\]]+|(?(?<={)[^{}]+|[^()]+)))
说明:在需要的if-then-else的建设,以确保开口 '{' 是对一个封闭匹配的 '}' 等
[\[{(] # Read [, { or (
((?(?<=\[) # Lookbehind: IF preceding char is [
[^\[\]]+ # THEN read all chars unequal to [ and ]
| # ELSE
(?(?<={) # IF preceding char is {
[^{}]+ # THEN read all chars unequal to { and }
| # ELSE
[^()]+))) # read all chars unequal to (and)
试试这个正则表达式:
(?<=\(|\[|{)[^()\[\]{}]+
或这一个:
(?<=\(|{|\[)(?!\(|{|\[)[^)\]}]+
Explantion(对于第一个正则表达式):
(?<=\(|\[|{)
- 正回顾后 - 寻找一个零长度匹配刚好在前面b雅{
或[
或(
[^()\[\]{}]+
- 未amoong以下任何字符的一个或多个出现次数:[
,(
,{
,}
,)
,]
解释(用于第二正则表达式):
(?<=\(|\[|{)
- 正回顾后 - 查找只是由{
或[
或(
(?!\(|{|\[)
preceeded零长度匹配 - 负先行 - 在先前的步骤中,发现这是刚刚由开口托架前面的位置。这块正则表达式验证它没有跟着另一个开头括号。因此,匹配刚刚位于最里面的开放括号之后的位置 - (
,{
或[
。
[^)\]}]+
- 一个或多个字符的出现不属于这些右括号之中 - ]
,}
,)
同样在这里:问题是:关闭符号是否与开始符号匹配?如何处理“{{test}}”?是匹配'测试'还是'测试')?你的正则表达式给出'测试'的结果,这是 - 不要误解我 - 没有错。 OP不清楚。 –
@mlambrichs检查我的第二个正则表达式。它也涵盖了这种情况。 – Gurman
不,它不。它明显地匹配'([[({{ofs)}}}}})))''中的'ofs'。问题是如果这是正确的,或者如果比赛应该是'')'。 –
以下代码适用于我。
<?php
$in = "This [is] a {{test}} sentence. The (((end))).";
preg_match_all('/(?<=\(|\[|{)[^()\[\]{}]+/', $in, $out);
echo $out[0][0]."<br>".$out[0][1]."<br>".$out[0][2];
?>
您也可以使用'[\ [\ {\(] +(\ w +)\] \} \)] +' – Mohammad
你需要的东西是这样的:'(?:\ [+ | \ (+ | \ {+)([a-zA-Z] +)(?:\] + | \)+ | \} +)' 请参阅示例:https://regex101.com/r/2fPHIK/1/ – Viktor
澄清需要:1.是否必须匹配开头的括号? 2.“捕获在OR之前有括号的字符串”。这是否意味着“结束”)应该导致匹配“结束”? –