使用组在一组多个限制器之间提取字符串

问题描述 投票:1回答:3

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

这是我的字符串:

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

现在,我可能不太了解这些小组是如何运作的,但我认为通过这个我可以得到我需要的剩余数据。我无法理解我所缺少的东西。

提前致谢

java indexoutofboundsexception
3个回答
3
投票

使用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));
}

https://ideone.com/RNjZRQ


1
投票

尝试使用.split().substring()


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

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

© www.soinside.com 2019 - 2024. All rights reserved.