我想请你帮助我使用以下正则表达式:
(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 ...
我非常感谢您提供的任何帮助。
答案 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)
示例文字
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] =>
)