Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式在Java中提取标记之间的文本_Java_Regex - Fatal编程技术网

正则表达式在Java中提取标记之间的文本

正则表达式在Java中提取标记之间的文本,java,regex,Java,Regex,我需要使用RegEx提取以下文本文件中:70:之后的值。值也可能包含换行符 我目前的解决方案是提取:70:和:之间的字符串,但这总是只返回一个匹配项,即第一个:70:和最后一个:之间的整个文本 :32B:xxx, :59:yyy something :70:ACK1 ACK2 :21:something :71A:something :23E:something value :70:ACK2 ACK3 :71A:something 如何使用Java实现这一点?理想情况下,我希望遍历所有值,即

我需要使用RegEx提取以下文本文件中
:70:
之后的值。值也可能包含换行符

我目前的解决方案是提取
:70:
之间的字符串,但这总是只返回一个匹配项,即第一个
:70:
和最后一个
之间的整个文本

:32B:xxx,
:59:yyy
something
:70:ACK1
ACK2
:21:something
:71A:something
:23E:something
value
:70:ACK2
ACK3
:71A:something
如何使用Java实现这一点?理想情况下,我希望遍历所有值,即

ACK1\nACK2
ACK2\nACK3

谢谢:)

编辑:我现在在做什么

Pattern pattern = Pattern.compile("(?<=:70:)(.*)(?=\n)", Pattern.DOTALL);
Matcher matcher = pattern.matcher(data);
while (matcher.find()) {
   System.out.println(matcher.group())
}

Pattern=Pattern.compile((?您需要一个循环来完成此操作

Pattern p = Pattern.compile(regexPattern);
List<String> list = new ArrayList<String>();
Matcher m = p.matches(input);
while (m.find()) {
    list.add(m.group());
}
Pattern p=Pattern.compile(regexpatern);
列表=新的ArrayList();
匹配器m=p.匹配(输入);
while(m.find()){
list.add(m.group());
}
如图所示,试试这个

String data = ""
    + ":32B:xxx,\n"
    + ":59:yyy\n"
    + "something\n"
    + ":70:ACK1\n"
    + "ACK2\n"
    + ":21:something\n"
    + ":71A:something\n"
    + ":23E:something\n"
    + "value\n"
    + ":70:ACK2\n"
    + "ACK3\n"
    + ":71A:something\n";
Pattern pattern = Pattern.compile(":70:(.*?)\\s*:", Pattern.DOTALL);
Matcher matcher = pattern.matcher(data);
while (matcher.find())
    System.out.println("found="+ matcher.group(1));
结果:

found=ACK1
ACK2
found=ACK2
ACK3

@Jens添加了我当前的解决方案。您希望输入的
32B
还是只
32
?@PavneetSingh我只需要
ACK1\nACK2
ACK2\nACK3
。不关心其他任何事情。;)如果您确定
始终只用作分隔符,您可以简单地使用
(?@SebastianProske有效!谢谢:)我已经在做了,但是
matcher.find()
只找到了一个匹配项。:(请检查我当前的解决方案。我将其添加到问题中。我在提供的解决方案中没有看到循环。我有
while(matcher.find()){}
在创建了
匹配器之后
。我认为这个问题与我的正则表达式有关,因为我只得到一个匹配项。如果你的循环是空的,那么你就没有把结果放在一起。
列表.add(m.group())
很重要。不,我的循环不是空的;我使用的是从
m.group()返回的值
-–更新了问题以澄清这一点。