簡體   English   中英

如何在java中使用正則表達式捕獲多線模式?

[英]How can I capture a multiline pattern using a regular expressions in java?

我有一個文本文件,我需要使用正則表達式解析。 我需要捕獲的文本是多行組,如下所示:

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來測試我的正則表達式。

(?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或其他不可見字符。

-powered regex tester, check out RegexPlanet .) (順便說一句:要在RegExr中測試該正則表達式,請刪除(?m)並檢查multiline框.RegExr由ActionScript提供支持,因此規則略有不同。對於正則表達式測試程序,請查看RegexPlanet 。)

這種模式應該有效((.*|\\n)*)

我認為,為了跨越多行,你的Pattern應該在DOTALL模式下編譯,就像

Pattern p = Pattern.compile("truck\\n(.*\\n){7}", Pattern.DOTALL);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM