2015-01-10 109 views
1

我需要將正則表達式分解爲其基本部分。例如,鑑於正則表達式[a-d]+[r-z]*我需要將其分成[a-d]+[r-z]*。這當然是一個非常簡單的例子,並且正則表達式語法可能會變得非常複雜...如何將正則表達式拆分爲多個部分?

是否存在一個(相對)簡單的方法來實現這個目標,或者我註定要反向設計一個正則表達式解析器?

我需要這個來找出給定的字符串是否是給定正則表達式匹配輸入的一部分。

+0

你有沒有考慮過使用正則表達式?你能展示一個更復雜的例子嗎? – usr2564301

+0

可能的[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – Basilevs

+2

@Jongware,用正則表達式解析正則表達式。 [它會混合](http://gizmodo.com/5690469/what-happens-when-you-blend-a-blendtec)? – Basilevs

回答

0

您可以蠻力這樣說:

import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Pattern; 
import java.util.regex.PatternSyntaxException; 

public class RegexSplitter {  
    private static boolean tryRegex(String regex) { 
     try { 
      Pattern.compile(regex); 
      return true; 
     } catch(PatternSyntaxException pse) { 
      return false; 
     } 
    } 

    public static void main(String args[]) { 
     String input = "[a-d]+[r-z]*"; 

     List<String> results = new ArrayList<>(); 

     int start = 0; 
     int end = 1; 
     boolean good = false; 
     while(end < input.length()) { 
      String part = input.substring(start, end); 
      if(!tryRegex(part)) { 
       if(good) { 
        good = false; 
        results.add(input.substring(start, end - 1)); 
        start = end-1; 
       } 
      } else { 
       good = true; 
      } 
      ++end; 
     } 
     if(tryRegex(input)) 
      results.add(input.substring(start,end)); 

     System.out.println(results); 
    } 
} 

// Output: [[a-d]+, [r-z]*] 

這是哈克和啓發,但它可能爲你的目的工作。

+0

輸入「rzrz」與匹配「正則表達式的一部分」有什麼關係,但不會從您的方法中產生任何結果? –

+0

這並不完美。 :)我明白[a-z] abcde [f-g] +會返回[a-z] abcde,[f-g] +。上面的代碼可以被改進以處理這種情況。我不知道是否需要依靠尤瓦爾試圖解決的問題。 –

+1

這是我想要在上面的評論中得到的觀點:原始問題是不可能的,除非它是更好的定義:) –

0

不知道這是你問的問題,但有幾個工具,如RegexBuddy,你可以用它來分析正則表達式。

RegexBuddy screenshot

像一些Python語言的正則表達式提供調試模式:

>>> import re 
>>> re.compile(r"[a-d]+[r-z]*", re.DEBUG) 
max_repeat 1 4294967295 
    in 
    range (97, 100) 
max_repeat 0 4294967295 
    in 
    range (114, 122) 
+0

此工具是否具有API? – Yuval

+0

[It does](http://www.regexbuddy.com/integration.html),但我不確定它是否公開此功能。 –