猿问

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

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


这是我的字符串:


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.索引出界异常: 无组 2


现在,可能我不太了解这些组是如何工作的,但我认为有了这个,我可以获得我需要的剩余数据。我无法理解我错过了什么。


提前致谢


白衣非少年
浏览 161回答 3
3回答

人到中年有点甜

使用字符串。.考虑到它需要一个正则表达式作为参数,并且是一个保留的正则表达式操作数,因此您需要用 .因此,将其设置为两个,因此不会被解释为您正在为字符使用 - 无效 - 转义序列:|\\\||String[]&nbsp;parts&nbsp;=&nbsp;text.split("\\|");看到它在这里工作:https://ideone.com/WibjUm如果你想使用你的正则表达式方法,你需要分组并捕获每个重复的字符,并将它们限制为除 之外的任何内容,可能使用像 .||\\|([^\\|]*)在您的循环中,您迭代并仅使用捕获组 1,因为它是每个匹配项将拥有的唯一组。m.find()String text = "|tab_PRO|1|1|#tRecordType#||0|tab_PRO|";Pattern p = Pattern.compile("\\|([^\\|]*)");Matcher m = p.matcher(text);while(m.find()){&nbsp; &nbsp; System.out.println(m.group(1));}https://ideone.com/RNjZRQ

慕尼黑的夜晚无繁华

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

慕侠2389804

如注释中所述,使用 更容易完成。String.split至于你自己的代码,你不必要地使用了内部循环,这导致了这个异常。您只有一个组,但 for 循环将导致您查询多个组。您的循环应该像以下简单一样简单:Pattern p = Pattern.compile("(?<=\\|)(.*?)\\|");Matcher m = p.matcher(text);while (m.find()) {&nbsp; &nbsp; String test = m.group(1);&nbsp; &nbsp; System.out.println(test);}打印tab_PRO11#tRecordType#0tab_PRO请注意,我必须在您的正则表达式中使用查找断言。
随时随地看视频慕课网APP

相关分类

Java
我要回答