在一组具有组的多个限制器之间提取字符串

时间:2019-04-08 10:18:41

标签: java indexoutofboundsexception

正如标题所述,我有一个字符串,我想从中提取一些数据。

这是我的字符串:

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组

现在,可能我不太了解这些组的工作原理,但是我认为,这样做可以获取所需的剩余数据。我无法理解我所缺少的。

预先感谢

3 个答案:

答案 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));
}

https://ideone.com/RNjZRQ

答案 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

请注意,我必须在正则表达式中使用后置断言。