两个相同或不同分隔符之间的子字符串(当分隔符出现多次时)

时间:2014-02-25 13:09:06

标签: java regex string split

我需要获取位于两个相同或不同分隔符之间的子字符串。分隔符将在字符串中多次出现,因此我需要提取位于第n次出现的delimiter1和第n次出现的delimiter2之间的子字符串。 例如:

myString : Ron_CR7_MU^RM^_SAF_34^

如果我需要提取位于第三次出现'_'和第三出现'^'之间的子串,我该怎么办?

Substring = SAF_34

或者我可以寻找位于第二个'^'和第四个'_'之间的子串,即:

Substring = _SAF

SQL等价物将是: substr(myString,instr(myString,'',1,3)+ 1,instr(myString,'^',1,3)-1-instr(myString,'',1,3 ))

3 个答案:

答案 0 :(得分:1)

如果您可以使用没有正则表达式的解决方案,您可以在字符串中找到索引所需的索引以及需要结束的索引。然后只需执行:myString.substring(start,end)即可获得结果。

最大的问题是找到startend。要做到这一点,你可以重复N(M)次:

  1. int pos = indexOf(delimiterX)
  2. myString = myString.substring(pos) //您可能希望处理myString
  3. 的副本

    希望你有个主意。

答案 1 :(得分:1)

我会用,

public static int findNth(String text, String toFind, int count) {
    int pos = -1;
    do {
        pos = text.indexOf(toFind, pos+1);
    } while(--count > 0 && pos >= 0);
    return pos;
}

int from = findNth(text, "_", 3);
int to = findNth(text, "^", 3);
String found = text.substring(from+1, to);

答案 2 :(得分:0)

你可以使用(如上所述)String.indexOf(string);创建一个简单地按顺序搜索分隔符之间的子串的方法。您需要确定是否需要所有子字符串(无论它们是否重叠......您的问题表明哪个),或者您是否希望看到重叠的字符串。以下是此类代码的试用

import java.util.Vector;

public class FindDelimitedStrings {

public static void main(String[] args) {
    String[] test = getDelimitedStrings("Ron_CR7_MU'RM'_SAF_34'", "_", "'");
    if (test != null) {
        for (int i = 0; i < test.length; i++) {
            System.out.println(" " + (i + 1) + ". |" + test[i] + "|");
        }
    }
}

public static String[] getDelimitedStrings(String source,
        String leftDelimiter, String rightDelimiter) {
    String[] answer = null;
    ;
    Vector<String> results = new Vector<String>();

    if (source == null || leftDelimiter == null || rightDelimiter == null) {
        return null;
    }

    int loc = 0;
    int begin = source.indexOf(leftDelimiter, loc);
    int end;
    while (begin > -1) {
        end = source
                .indexOf(rightDelimiter, begin + leftDelimiter.length());
        if (end > -1) {
            results.add(source.substring(begin, end));
            // loc = end + rightDelimiter.length(); if strings must be
            // returned as pairs
            loc = begin + 1;
            if (loc < source.length()) {
                begin = source.indexOf(leftDelimiter, loc);
            } else {
                begin = -1;
            }
        } else {
            begin = -1;
        }
    }

    if (results.size() > 0) {
        answer = new String[results.size()];
        results.toArray(answer);
    }
    return answer;
}
}