如何用正则表达式排除两个大括号之间的文本?

时间:2017-06-03 13:57:46

标签: php regex preg-match-all regex-negation curly-braces

我是正则表达式的新手,我有这样的文字:

  

测试{{这不应该被选中,大括号也是}}但是   应该选择这个{或}。所以我想排除所有文字   在开始和结束的花括号之间。

我想要这个结果

  

"测试"

  

"但应选择此{或}。所以我想排除所有文字   在开始和结束的花括号之间。"

这是我用过的表达方式:

$p = '/[a-zA-Z0-9#\' ]+(?![^{{]*}})/';

但这不包括单个花括号 我想知道如何在文本中包含单个花括号,并且只在两个花括号之间排除文本 请你能给我一些关于正则表达式的好文档吗?我想了解更多相关信息。

4 个答案:

答案 0 :(得分:1)

(?:^|(?:}}))(.+?)(?:$|{{)

试一试:https://regex101.com/r/2Xy7gU/1/
这里发生了什么:

  • (?:^|(?:}})) - 以字符串的开头或}}
  • 开头
  • (.+?) - 匹配所有内容(ungreedy)
  • (?:$|{{) - 匹配必须 以字符串的两端结尾或{{

你想要的(没有括号)在第一组。

答案 1 :(得分:1)

输入(我将字符串加倍以实现效果):

$string='test{{this should not be selected and the curly brackets too}} but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets. test{{this should not be selected and the curly brackets too}} but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets.';

方法#1 preg_split()

var_export(preg_split('/{{[^}]*}}/',$string,null,PREG_SPLIT_NO_EMPTY));
// Added the fourth param in case the input started/ended with a double curly substring.

方法#2 preg_match_all()

var_export(preg_match_all('/(?<=}{2}|^)(?!{{2}).*?(?={{2}|$)/s',$string,$out)?$out[0]:[]);

输出(无论哪种方式):

array (
  0 => 'test',
  1 => ' but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets. test',
  2 => ' but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets.',
)

preg_split()将双卷曲包装的子字符串视为“分隔符”,并将完整的字符串拆分为它们。

preg_match_all()方法模式...... .closest()这使用了一个积极的外观和一个积极的前瞻,两者都寻找双重曲线或者弦的开始/结束。它在中间使用负前瞻,以避免在新行的开头匹配不需要的双卷曲字符串。最后,模式末尾的s修饰符将允许.匹配换行符。

答案 2 :(得分:0)

使用\{\{[^\}]*\}\}并将所有出现的\{ - { \{ - { [^\}]* - everything except } \} - } \} - } 替换为空字符串。

示例:http://www.regextester.com/?fam=97777

说明:

require

答案 3 :(得分:0)

2个选项:

  • easy:只考虑{{}}之间的块作为拆分模式
    $validblocks = preg_split("/{{[\w .]+}}/", $str);
  • 复杂:使用组并首先捕获重新定义的模式,然后剩下的是:
    (?<novalid>{{[\w ]+}})|(?<valid>{|[\w .]*|})
    随后管理它你想要的。示例:https://regex101.com/r/SK729o/2