我有一个类似
的字符串(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@"));
答案 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