2013-06-30 28 views
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 ... 

我真的很感激任何幫助,您可以提供。

+1

什麼是風味/工具? – acdcjunior

回答

1

在正則表達式本身的語法中沒有真正的方法來否定正則表達式。但是,您可以將正則表達式應用於數據集,然後使用返回的indeces刪除匹配的區域。這會給你帶來一切沒有匹配的正則表達式,有效地反轉它。

如果你在* nix的外殼這樣做,你可以使用:

grep -v <regex> 

它打印不包含正則表達式的每一行。根據你所說的話,這似乎並不是這樣。

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。它應該做什麼需要。

+0

我正在用Java寫一個解析器。以下是一段代碼: Pattern p = Pattern.compile(「(start {(。*?)}((?:(start {(。*?)}。*?end {(。*?)} )|。)*?)end {(\ 2)})「,Pattern.DOTALL); Matcher imatcher = p.matcher(matcher.group(2)); while(imatcher.find()){\\ TODO} – hold3n

+1

我不是Java開發人員,但您應該看看使用[Pattern.split](http://docs.oracle.com/javase/6/docs /api/java/util/regex/Pattern.html#split(java.lang.CharSequence))。它應該做什麼需要。 –

+0

非常感謝。拆分似乎工作正常。這是我的代碼: String [] splitString = ANALYZED_STRING.split(「(?sm)start \\ {(。*?)\\}。*?end \\ {(\\ 1)\\}」); for(String string:splitString){ System.out.println(string); } – hold3n

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] => 
    ) 
+0

感謝您使用此解決方案。 – hold3n