我有一个我需要使用正则表达式解析的文本文件。我需要捕获的文本是多行组,如下所示:
truck
zDoug
Doug's house
(123) 456-7890
Edoug@doug.com
30
61234.56
8/10/2003
vehicle
eRob
Rob's house
(987) 654-3210
Frob@rob.com
对于这个例子,我需要捕获卡车,然后是接下来的七行。换句话说,在这个“块”中,我有8组。这是我尝试过但它不会捕获下一行:
(truck)\n(\w).
注意:在将其移植到Java之前,我正在使用程序RegExr来测试我的正则表达式。
答案 0 :(得分:5)
(?m)^truck(?:(?:\r\n|[\r\n]).+$)*
这假定整个文本已被读入单个字符串(即,您不是逐行读取文件),但它不假设行分隔符始终\n
,正如您的代码所做的那样。至少你应该允许\r\n
和\r
,这是(?:\r\n|[\r\n])
所做的。但它仍然只匹配一个分隔符,因此匹配在块结尾处的双线分隔符之前停止。
匹配数据块后,可以将其拆分为行分隔符以获取各行。这是一个例子:
Pattern p0 = Pattern.compile("(?m)^truck(?:(?:\r\n|[\r\n]).+$)*");
Matcher m = p0.matcher(data);
while (m.find())
{
String fullMatch = m.group();
int n = 0;
for (String s : fullMatch.split("\r\n|[\r\n]"))
{
System.out.printf("line %d: %s%n", n++, s);
}
}
输出:
line 0: truck line 1: zDoug line 2: Doug's house line 3: (123) 456-7890 line 4: Edoug@doug.com line 5: 30 line 6: 61234.56 line 7: 8/10/2003
我还假设每行数据至少包含一个字符,并且数据块之间的空行实际上是空的 - 即没有空格,TAB或其他不可见字符。
(顺便说一句:要在RegExr中测试该正则表达式,请删除(?m)
并检查multiline
框.RegExr由ActionScript提供支持,因此规则略有不同。对于 Java - 动力正则表达式测试程序,请查看RegexPlanet。)
答案 1 :(得分:3)
我认为为了跨越多行,你的Pattern应该在DOTALL模式下编译,比如
Pattern p = Pattern.compile("truck\\n(.*\\n){7}", Pattern.DOTALL);
答案 2 :(得分:3)
此模式应该有效((.*|\n)*)