否定正则表达式

时间:2013-06-30 02:48:02

标签: java regex

我想请你帮助我使用以下正则表达式:

(start{(.*?)}((?:(start{(.*?)}.*?end{(.*?)})|.)*?)end{(\2)})

我想否定它。假设我们有以下输入:

start{outer1}
  Recipe A:
    start{inner1}
      -ingredient1
      -ingredient2
    end{inner1}
end{outer1}
... something ... 
... blah blah blah ...    
start{outer2}
  Recipe B:
    start{inner1}
      - ingredient1
    end{inner1}
end{outer2}
... something ...
输出应该是:

... something ... 
... blah blah blah ...
... something ...

我非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:3)

这取决于您使用的语言/环境,但几乎普遍,支持匹配的任何正则表达式引擎也支持拆分。拆分时,匹配项之间输入的任何部分都以数组(或类似结构)返回。

例如在C#中:

var re = new Regex("(start{(.*?)}((?:(start{(.*?)}.*?end{(.*?)})|.)*?)end{(\2)})");
var matches = re.Matches(input); // { "start{outer1}...", "start{outer2}..." }
var split = re.Split(input); // { "... something ... ... blah blah blah ...", "... something ... " }

我不是Java开发人员,但您应该考虑使用Pattern.split。它应该做什么需要。

答案 1 :(得分:1)

没有办法在正则表达式本身的语法中否定正则表达式。但是,您可以将正则表达式应用于数据集,然后使用返回的indeces删除匹配的区域。这会让你得到没有匹配正则表达式的所有内容,从而有效地反转它。

如果您在* nix shell中执行此操作,则可以使用:

grep -v <regex>

打印不包含正则表达式的每一行。根据你所说的,但事实并非如此。

答案 2 :(得分:1)

描述

这个正则表达式会将好东西与坏东西分开,但是你必须收集所有捕获组2的值,并且只有在组1为空时才使用它们

^start\{([^}]*)\}.*?^end\{\1\}[\r\n]*|(.*?)[\r\n]*(?=^start\{[^}]*\}|\Z)

enter image description here

PHP代码示例:

示例文字

start{outer1}
  Recipe A:
    start{inner1}
      -ingredient1
      -ingredient2
    end{inner1}
end{outer1}
... something ... 
... blah blah blah ...    
start{outer2}
  Recipe B:
    start{inner1}
      - ingredient1
    end{inner1}
end{outer2}
... something ...

<强>代码

<?php
$sourcestring="your source string";
preg_match_all('/^start\{([^}]*)\}.*?^end\{\1\}[\r\n]*|(.*?)[\r\n]*(?=^start\{[^}]*\}|\Z)/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

<强>匹配

请注意,捕获组2只有所需的值。

[0] => Array
    (
        [0] => start{outer1}
  Recipe A:
    start{inner1}
      -ingredient1
      -ingredient2
    end{inner1}
end{outer1}

        [1] => ... something ... 
... blah blah blah ...    

        [2] => start{outer2}
  Recipe B:
    start{inner1}
      - ingredient1
    end{inner1}
end{outer2}

        [3] => ... something ...
        [4] => 
    )

[1] => Array
    (
        [0] => outer1
        [1] => 
        [2] => outer2
        [3] => 
        [4] => 
    )

[2] => Array
    (
        [0] => 
        [1] => ... something ... 
... blah blah blah ...    
        [2] => 
        [3] => ... something ...
        [4] => 
    )