正如标题所述,我有一个字符串,我想从中提取一些数据。
这是我的字符串:
text = "|tab_PRO|1|1|#tRecordType#||0|tab_PRO|";
,我想提取管道之间的所有数据:tab_PRO,1、1 ...依此类推 。 我尝试过:
Pattern p = Pattern.compile("\\|(.*?)\\|");
Matcher m = p.matcher(text);
while(m.find())
{
for(int i = 1; i< 10; i++) {
test = m.group(i);
System.out.println(test);
}
}
通过这个,我得到了第一组tab_PRO。但我也遇到错误
java.lang.IndexOutOfBoundsException:没有第2组
现在,可能我不太了解这些组的工作原理,但是我认为,这样做可以获取所需的剩余数据。我无法理解我所缺少的。
预先感谢
答案 0 :(得分:3)
使用String.split()
。考虑到它期望使用正则表达式作为参数,并且|
是保留的正则表达式操作数,因此您需要使用\
对其进行转义。因此,将其设置为两个\
,以使\|
不会被解释为好像您对|
字符使用了-无效-转义序列:
String[] parts = text.split("\\|");
看到它在这里工作: https://ideone.com/WibjUm
如果您想使用正则表达式方法,则需要对每个|
之后的字符重复进行分组和捕获,并将它们限制为|
以外的其他字符,可能使用诸如\\|([^\\|]*)
。
在循环中,您遍历m.find()
并仅使用捕获组1,因为捕获组1是每个匹配项中唯一的组。
String text = "|tab_PRO|1|1|#tRecordType#||0|tab_PRO|";
Pattern p = Pattern.compile("\\|([^\\|]*)");
Matcher m = p.matcher(text);
while(m.find()){
System.out.println(m.group(1));
}
答案 1 :(得分:1)
尝试使用{{1}}或{{1}}
答案 2 :(得分:0)
如评论中所述,使用String.split
可以更轻松地完成此操作。
对于您自己的代码,您不必要使用内部循环,这会导致该异常。您只有一组,但是for循环将导致您查询多个组。您的循环应该很简单:
Pattern p = Pattern.compile("(?<=\\|)(.*?)\\|");
Matcher m = p.matcher(text);
while (m.find()) {
String test = m.group(1);
System.out.println(test);
}
然后打印
tab_PRO
1
1
#tRecordType#
0
tab_PRO
请注意,我必须在正则表达式中使用后置断言。