1

我想请您帮我处理以下正则表达式:

(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 ...

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

4

3 回答 3

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。它应该做需要的事情。

于 2013-06-30T02:54:31.833 回答
1

在正则表达式本身的语法中,实际上并没有一种方法可以否定正则表达式。但是,您可以将正则表达式应用于数据集,然后使用返回的索引删除匹配区域。这会给您留下与正则表达式匹配的所有内容,从而有效地反转它。

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

grep -v <regex>

它打印不包含正则表达式的每一行。根据你的说法,情况似乎并非如此。

于 2013-06-30T02:54:05.797 回答
1

描述

此正则表达式将区分好与坏,但是您必须收集所有捕获组 2 的值,并且仅在第 1 组为空时使用它们

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

在此处输入图像描述

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] => 
    )
于 2013-06-30T04:33:09.907 回答