Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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,我有一个包含以下内容的文件: ~LayerData type="waypointlist" type="waypointlistend" type="track" name="Track1" color=#695cbb type="trackpoint" latitude="43.5032064" longitude="16.4266248" type=&q

我有一个包含以下内容的文件:

~LayerData
type="waypointlist"
type="waypointlistend"
type="track" name="Track1" color=#695cbb
type="trackpoint" latitude="43.5032064" longitude="16.4266248"
type="trackpoint" latitude="43.5071074767561" longitude="16.48329290000057"
type="trackend"
~EndLayerData
~LayerData
type="waypointlist"
type="waypointlistend"
type="track" name="Track2" color=#000000
type="trackpoint" latitude="43.51037193515589" longitude="16.491883500895977"
type="trackpoint" latitude="43.521582832754135" longitude="16.473187288140295"
type="trackend"
~EndLayerData
我正在使用以下方法提取LayerData->EndLayerData匹配:

Pattern p = Pattern.compile("(~LayerData(.|\n)*~EndLayerData)");
Matcher m = p.matcher(s);
结果,我得到了包含三项的m.group():前两项相同,并且包含完整的文件。最后一个是“\n”。我希望接收的Track1和Track2是分开的。

试试这种模式

(~LayerData(.|\n)*?~EndLayerData)

更新: 使用regex101中“工具”下的“代码生成器”获取特定于语言的regex

String regex = "\\~LayerData(.|\\n)*?\\~EndLayerData";
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(string); 
while (matcher.find()) { 
System.out.println(matcher.group(0)); 
}
较早的答覆:
您没有正确获得匹配,因为您使用的正则表达式不正确。由于它与以“~LayerData”开头并以“~EndLayerData”结尾的所有内容都匹配,因此整个文件都将匹配。使用(有助于可视化)创建适当的正则表达式,并使用该正则表达式可以解决此问题。

您可以使用负前瞻性匹配LayerData,后跟所有不以LayerData或EndLayerData开头的行

^~LayerData(?:\R(?!~(?:End)?LayerData).*)*\R~EndLayerData
解释

  • ^~LayerData
    从字符串开头匹配LayerData
  • (?:
    非捕获组
    • \R(?!(?:End)?LayerData)
      匹配换行符,断言直接右侧的不是EndLayerData或LayerData
    • *
      匹配行的其余部分
  • )*
    关闭组并重复0多次以获取所有行
  • \R~EndLayerData
    匹配换行符和EndLayerData
在带有双转义反斜杠的Java中:

String regex = "^~LayerData(?:\\R(?!~(?:End)?LayerData).*)*\\R~EndLayerData";
|

示例代码

String regex = "^~LayerData(?:\\R(?!~(?:End)?LayerData).*)*\\R~EndLayerData";
String string = "...";

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(0));
}

你到底想从这里提取什么?记住要正确地逃跑。字符串中的单个
`变为
\`
\n
是换行符,如果要匹配它,需要使用
\\n
@TimBiegeleisen:我正在尝试提取两层数据sections@Polygnome:这是从IDE复制粘贴,源代码中有\\谢谢,但结果相同。问题是文件中间的EntEntRead层数据没有被检测出来,不是LealDebug内容本身。这是ReGeX:但是这里的问题是设置/G标志,它是在java中默认启用的,但是结果不同,ON ReXE101.COMNOT工作,请看在线java测试:@厄内斯特工作得很好。请看一看: