如果我有一个表格的字符串:
$text='remove1 (keep1) remove2 (keep2) remove3';
使用回复
https://stackoverflow.com/a/5293343/1154853
$re = '/[^()]*+(\((?:[^()]++|(?1))*\))[^()]*+/';
$text = preg_replace($re, '$1', $text);
我得到了
(keep1)(keep2)
如果我想从
开始$text='remove1 {keep1} remove2 {keep2} remove3';
到
{keep1}{keep2}
我想更改分隔符,如何更改给定的正则表达式?我尝试了各种各样的改变组合(但{我无法让它发挥作用。我发现这些reg exp很难!
答案 0 :(得分:1)
你需要转义大括号:
$re = '/[^()]*+(\((?:[^()]++|(?1))*\))[^()]*+/';
^^ ^ ^^ ^ ^^
Esc Esc
标记是分隔符的位置,只有两个需要使用斜杠进行转义。我相信这会奏效:
$re = '/[^{}]*+(\{(?:[^{}]++|(?1))*\})[^{}]*+/';
答案 1 :(得分:0)
对于括号()
,您可以使用:
$re = '/(?:^|(?<=\)))[^(]+/';
$text = preg_replace($re, '', $text);
编辑对于大括号{}
,请使用以下变体:
$re = '/(?:^|(?<=\}))[^{]+/';
$text = preg_replace($re, '', $text);
请注意,对于嵌套结构,这些将失败 - 正如所有正则表达式所做的那样。
解释
(?: # non-capturing group start ^ # start-of-string | # or... (?<=\}) # look-behind: a position preceded by a } closing brace ) # end non-capturing group [^{]+ # any character except an opening brace, multiple times
非捕获组将匹配的开始位置在右大括号后面或字符串的开头处。 [^{]+
匹配每个字符直到下一个括号。实际上,这匹配{words}
之间的所有内容。
请参阅:http://rubular.com/r/1Sp72TbHIi
编辑#2 当然,思考不那么复杂,这也有用:
$re = '/((?:\\\w+)?\{[^}]*\})/';
$text = preg_replace($re, '$1', $text);
答案 2 :(得分:0)
试试这个:
$re = '/[^{}]*+(\{(?:[^{}]++|(?1))*\})[^{}]*+/';
$text = preg_replace($re, '$1', $text);