获取包含多个字符串的字符串中的子字符串

时间:2015-07-10 05:36:28

标签: java

我有一个类似

的字符串
(D@01)5(D@02)14100319530033M(D@03)1336009-A-A(D@04)141002A171(D@05)1(D@06)

现在我想在(D@01)5(D@02)

之间获得子串

如果我有类似

的话
(D@01)5(D@02)

我可以通过

获取详细信息
    quantity         = content.substring(content.indexOf("(D@01)") + 6, content.indexOf("(D@02)"));

但有些事情D@02可能与@05不同,现在我如何使用简单的(D@来获取字符串。 (D@

重复多次

基本上这就是我想做的事情

content.substring(content.indexOf("(D@01)") + 6, content.nextOccurringIndexOf("(D@"));

5 个答案:

答案 0 :(得分:2)

我想你可以做到

int fromIndex = content.indexOf("(D@01)") + 6;
int toIndex = content.indexOf("(D@", fromIndex);    // next occurring

if (fromIndex != -1 && toIndex != -1)
    str = content.substring(fromIndex, toIndex);

<强>输出

5

请参阅http://ideone.com/RrUtBy演示。

答案 1 :(得分:2)

假设标记和值是关联的,并且您想知道每个((D@01) == 5),那么您可以使用Pattern / {{1 API,例如

Matcher

哪个输出

String text = "(D@01)5(D@02)14100319530033M(D@03)1336009-A-A(D@04)141002A171(D@05)1(D@06)";
Pattern p = Pattern.compile("\\(D@[0-9]+\\)");
Matcher m = p.matcher(text);

while (m.find()) {
    String name = m.group();
    if (m.end() < text.length()) {
        String content = text.substring(m.end()) + 1;
        content = content.substring(0, content.indexOf("("));
        System.out.println(name + " = " + content);
    }
}

现在,这有点沉重,我创造了某种&#34;标记&#34;包含键(D@01) = 5 (D@02) = 14100319530033M (D@03) = 1336009-A-A (D@04) = 141002A171 (D@05) = 1 的对象及其开始和结束索引。然后我将这些信息保存在(D@01)中,并根据早期密钥的结尾和最后一个密钥的开头来删除每个值...但这只是我;)< / p>

答案 2 :(得分:1)

如果想要(D@##)

之间的内容,您可以使用正则表达式捕获组
Pattern p = Pattern.compile("(\\(D@\\d+\\))(.*?)(?=\\(D@\\d+\\))");
Matcher matcher = p.matcher("(D@01)5(D@02)14100319530033M(D@03)1336009-A-A(D@04)141002A171(D@05)1(D@06)");
while(matcher.find()) {
  System.out.println(String.format("%s start: %2s end: %2s matched: %s ",
      matcher.group(1), matcher.start(2), matcher.end(2), matcher.group(2)));
}
(D@01) start:  6 end:  7 matched: 5 
(D@02) start: 13 end: 28 matched: 14100319530033M 
(D@03) start: 34 end: 45 matched: 1336009-A-A 
(D@04) start: 51 end: 61 matched: 141002A171 
(D@05) start: 67 end: 68 matched: 1 

答案 3 :(得分:0)

您可以使用正则表达式来分割输入 - 正如@MadProgrammer所建议的那样。 split()方法生成String s的表,因此搜索值的出现顺序与split()生成的表中的值的顺序完全相同。例如:

String input = "(D@01)5(D@02)14100319530033M(D@03)1336009-A-A(D@04)141002A171(D@05)1(D@06)";

String[] table = input.split("\(D@[0-9]+\)");

答案 4 :(得分:0)

试试这个:

public static void main(String[] args) {
    String input = "(D@01)5(D@02)14100319530033M(D@03)1336009-A-A(D@04)141002A171(D@05)1(D@06)";
    Pattern p = Pattern.compile("\\(D@\\d+\\)(.*?)(?=\\(D@\\d+\\))");
    Matcher matches = p.matcher(input);
    while(matches.find()) {
        int number = getNum(matches.group(0)); // parses the number
        System.out.printf("%d. %s\n", number, matches.group(1)); // print the string
    }
}

public static int getNum(String str) {
    int start = str.indexOf('@') + 1;
    int end = str.indexOf(')', start);
    return Integer.parseInt(str.substring(start,end));
}

结果:

1. 5
2. 14100319530033M
3. 1336009-A-A
4. 141002A171
5. 1