1

我需要在 Java 中编写一个方法,该方法可以接受一个字符串文本参数和一个返回字符串数组的字符串“正则表达式”参数数组。

我希望返回的 Array 基本上可以执行该String.split操作,但是使用多个 String 正则表达式,而不是剥离正则表达式,而是将其保留在数组中。

例子:
Input: "int a=10; a++;"
Regexes: "int", ";", "++", "="
Output: "int", " a", "=", "10", ";", " a", "++", ";"

我尝试了一些事情,包括以下内容,但都没有奏效

public static String[] splitIntoBits(String in, String[] regex)
{
    List<String> bitList = new ArrayList<String>();

    for(int i = 0; i < in.length(); i++)
    {
        int lastIndex=0;
        //Check that character against all regexes
        for(int j = 0; j < regex.length; j++)
        {   
            if(in.substring(i).startsWith(regex[j]))
            {
                bitList.add(in.substring(lastIndex, i));
                lastIndex=i;
            }
        }
    }

    return bitList.toArray(new String[0]);
}
4

1 回答 1

0

您可以构造一个正则表达式来匹配参数中的所有正则表达式,然后使用.Matcher.find()跟踪先前匹配项的结束索引end()

注意:在下面的代码中,我展示Pattern.quote(r)了处理“++”(这是一个无效的正则表达式模式)。如果您确实支持正则表达式作为参数,只需删除该调用。

    String[] regex = { "int", ";", "++", "=" };
    StringBuilder pattern = new StringBuilder();
    for (String r : regex) {
        pattern.append('|').append(Pattern.quote(r));
    }

    String input = "int a=10; a++;";
    Matcher m = Pattern.compile(pattern.substring(1)).matcher(input);
    // e.g. m = Pattern.compile("int|;|\\+\\+|=").matcher(input);
    List<String> result = new ArrayList<String>();
    for (int i=0 ; m.find() ; i = m.end()) {
        if (i != m.start()) {
            result.add(input.substring(i, m.start()));
        }
        result.add(m.group(0));
    }
    String[] array = result.toArray(new String[result.size()]);
于 2013-04-24T21:19:13.793 回答