如何将正则表达式分成几部分?

时间:2015-01-10 18:16:58

标签: regex

我需要将正则表达式分解为其基本部分。例如,给定正则表达式[a-d]+[r-z]*我需要将其拆分为[a-d]+[r-z]*。这当然是一个非常简单的例子,正则表达式语法可能变得非常复杂......

是否有(相对)简单的方法来实现这一目标,还是我注定要对正则表达式解析器进行逆向工程?

我需要这个来查明给定的字符串是否是给定正则表达式的匹配输入的一部分。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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和启发式的,但它可能适用于您的目的。