2013-04-28 41 views
3

我想匹配兩個字符串之間的文本,但開始的字符串具有嚴格的邊界條件。Java正則表達式:匹配具有邊界條件的兩個字符串之間的文本

樣品輸入:

start 
From: h 
From:b 
xyz 
Subject: 
end 

我需要From:Subject:之間的匹配。

如果我使用(From:.*).*(Subject:)與DOTALL,它產生

From: h 
From:b 
xyz 
Subject: 

,但我只需要

From:b 
xyz 
Subject: 

因爲起始字符串有嚴格的邊界條件。這是必要的,因爲起始字符串可以在文檔中的任何位置,然後上面的正則表達式將匹配一個大文本而不是幾行。

%%%%%%%%%%%%問題重新定義%%%%%%%%%%%%%% 我的文字中,我需要匹配:

From:<any text> 
To:<any text> 
Subject:<any text> 

問題在於:所有三個組件都可以在一行中,可以用一個換行符分隔,或者可以用兩個換行符分隔......在所需的匹配之前和之後可以包含From:<any text>的文本,這就是爲什麼我需要嚴格的界限。

+0

你留着重新定義你的問題,並要匹配的文本。這會貶低最初創建此問題時發佈的舊答案。請堅持您的原始問題,或者在創建問題時儘可能使問題清楚。 – syb0rg 2013-04-28 15:50:33

+0

我很抱歉造成不便,但我想我沒有改變問題或想要的模式。在我原來的問題中,我有'From:'兩次,因爲它是實際的文本。在編輯中,我已經提到了我需要的東西,並且還聲明任何可能出現在所需模式之前和之後。 – user2200660 2013-04-29 17:52:32

+0

另外,我添加的註釋'%%%%問題重新定義%%%%',因爲當兩個人張貼的解決方案,這兩個是不正確的,我想我還不夠清楚描述的問題。這就是爲什麼我重新定義了希望更好地理解問題的問題。我不打算混淆任何人。如果我這樣做,我很抱歉。 – user2200660 2013-04-29 17:54:53

回答

2

嘗試了這一點:

String input = "start From: h From:b xyz Subject: end"; 
Matcher matcher = Pattern.compile("(?<=^((?!From:).)*(From: [A-Za-z0-9]))(.+?)(Subject:)").matcher(input); 
if (matcher.find()) 
{ 
    System.out.println(matcher.group()); 
} 

輸出:From:b xyz Subject:。正則表達式的


解釋((?<=^((?!From:).)*(From: [A-Za-z0-9]))(.+?)(Subject:)):

  • (?<=開始尋找背後
  • ^字符串
  • ((?!From:).)的開始,如果放眼望去,你不能看到 「發件人」然後匹配任何字符
  • *匹配以前的語句零次或多次
  • (From: [A-Za-z0-9]))匹配的第一個「從:」和它的內容
  • )停止看着身後
  • (.+?)我們正在尋找
  • (Subject:)匹配字符串
+0

你是怎麼測試這個的? Java不支持無界lookbehinds(但某些版本有一個導致它們忘記並嘗試的錯誤)。此外,OP的數據是以多行的形式出現的,並不是像您擁有的一樣。 (OP在編寫答案時可能已經編輯過這個問題,如果你足夠快地完成了這個任務,SO並不會將這個問題標記爲已編輯。) – 2013-04-28 03:58:24

+0

它沒有給出正確的結果。我試着輸入'「start From:h strt From:b xyz Subject:end」'它匹配'strt From:b xyz Subject:',這是不正確的。我需要從'From:' – user2200660 2013-04-28 04:26:22

+0

@AlanMoore開始的一切它不?我用Java 7在Eclipse中測試它,並且它工作正常... – syb0rg 2013-04-28 15:52:24

0

相反匹配使用.*的主題領域在DOTALL模式下,我建議您一次匹配一條線,斷言該線不以From:開頭。

"(?m)^From:.*[\r\n]+(?:(?!From:).*[\r\n]+)*Subject:.*$" 

這是最小的實現。根據文本結構的不同,它可能會匹配太多或太慢(特別是在不匹配的情況下)。這裏有一個更強大的版本:

"(?m)^(?>From:.*[\r\n]+)(?>(?!From:|Subject:).*[\r\n]+)*+Subject:.*$" 
+0

它不適用於顯示的示例...我將在帖子中再次解釋該問題。 – user2200660 2013-04-28 04:48:04

相關問題