正如标题所说,我有一个字符串,我想从它中提取一些数据。
这是我的字符串:
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
现在,我可能不太了解这些小组是如何运作的,但我认为通过这个我可以得到我需要的剩余数据。我无法理解我所缺少的东西。
提前致谢
使用String.split()
。考虑到它期望正则表达式作为参数,而|
是一个保留的正则表达式操作数,所以你需要用\
来逃避它。因此,使它成为两个\
所以\|
将不会被解释为你使用了一个 - 无效 - |
字符的转义序列:
String[] parts = text.split("\\|");
看到它在这里工作:https://ideone.com/WibjUm
如果你想采用你的正则表达式方法,你需要在每个|
之后对每个重复的字符进行分组和捕获,并将它们限制为除了|
之外的任何东西,可能使用像\\|([^\\|]*)
这样的正则表达式。
在你的循环中,你迭代m.find()
并只使用捕获组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));
}
尝试使用.split()
或.substring()
正如评论中所提到的,使用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
请注意,我必须在正则表达式中使用后视断言。