为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣非少年 2022-09-28 10:01:43
正如标题所说,我有一个字符串,我想从中提取一些数据。这是我的字符串: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现在,可能我不太了解这些组是如何工作的,但我认为有了这个,我可以获得我需要的剩余数据。我无法理解我错过了什么。提前致谢
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

使用字符串。.考虑到它需要一个正则表达式作为参数,并且是一个保留的正则表达式操作数,因此您需要用 .因此,将其设置为两个,因此不会被解释为您正在为字符使用 - 无效 - 转义序列:|\\\||

String[] parts = 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()){

    System.out.println(m.group(1));

}

https://ideone.com/RNjZRQ


查看完整回答
反对 回复 2022-09-28
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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



查看完整回答
反对 回复 2022-09-28
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

如注释中所述,使用 更容易完成。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

请注意,我必须在您的正则表达式中使用查找断言。


查看完整回答
反对 回复 2022-09-28
  • 3 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号