java - 在一组带组的多个限制器之间提取字符串

标签 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: No group 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));
}

https://ideone.com/RNjZRQ

关于java - 在一组带组的多个限制器之间提取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55571140/

相关文章:

java - setColorFilter 问题

java - 如何获取调用者(或调用者的调用者,或更深入的调用堆栈)实例 ID - my.package.MyClass@3e7bfc04

java - 使用实体监听器测量数据库操作所花费的时间

java - 如何使用 java 将参数传递给 shell 脚本?

java - SQL更新挂起Java程序

java - 从SQLite数据库删除项目时出错

java - 用户输入显示最短路径

Java字符串索引越界困惑

java.lang.ArrayIndexOutOfBoundsException : 0 异常

Ruby - 数组、边界和引发异常