【问题标题】:Java String Split/ManipulationJava 字符串拆分/操作
【发布时间】:2013-04-24 21:06:10
【问题描述】:

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

我希望返回的数组基本上做String.split 所做的事情,但是使用多个字符串正则表达式,而不是剥离正则表达式,而是将其保留在数组中。

示例:
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]);
}

【问题讨论】:

  • 如何处理重叠模式(换句话说,匹配不明确的地方)?
  • 您可以在每次拆分后创建一个新的 ArrayList,捕获 String[] 并将它们输入到列表中。然后使用 List 将字符串输入到下一阶段。
  • @durron597 - 我可能会通过更具体地检查正则表达式之前或之后的内容来处理这个问题。
  • 如果你真的想解析代码,你需要的不仅仅是 split()。
  • @peter.murray.rust - 我需要什么?

标签: java arrays string split


【解决方案1】:

您可以构造单个正则表达式来匹配参数中的所有正则表达式,然后使用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()]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多