在一组带组的多个限制器之间提取字符串
Extract string between a set of multiple limiters with groups
正如标题所说,我有一个字符串,我想从中提取一些数据。
这是我的字符串:
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
现在,我可能不太了解这些组是如何工作的,但我认为有了这个我可以获得我需要的剩余数据。我不明白我错过了什么。
提前致谢
尝试使用 .split()
或 .substring()
使用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));
}
如评论中所述,使用 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
请注意,我必须在您的正则表达式中使用后视断言。
正如标题所说,我有一个字符串,我想从中提取一些数据。
这是我的字符串:
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
现在,我可能不太了解这些组是如何工作的,但我认为有了这个我可以获得我需要的剩余数据。我不明白我错过了什么。
提前致谢
尝试使用 .split()
或 .substring()
使用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));
}
如评论中所述,使用 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
请注意,我必须在您的正则表达式中使用后视断言。