2015-01-10 5 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]*] 

Это Hacky и эвристический, но он может работа для ваших целей.

+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

[Он делает] (http://www.regexbuddy.com/integration.html), но я не уверен, предоставляет ли он эту функцию. –

Смежные вопросы