2015-10-05 50 views
0

我想讀取包含以下內容的文本文件,我試圖使用正則表達式匹配並將內容分割爲2個優先級隊列的不同字符串,以製作基於堆的優先級隊列任務調度。但首先,我需要確保格式在我使用Scanner讀取的文本文件中是正確的,它從包含字母數字字母的任務開始,然後是非負整數(到達時間)和自然數(截止時間)。以下是正確格式的文本文件中輸入:在java中重複正則表達式模式

task1 2 3 task2 2 3 task3 2 3 task4 4 5 task5 4 5 
task6 7 9 task7 7 9 task8 7 9 task9 7 9 
task10 7 9 task11 7 9 task12 7 9 task13 7 9 
task14 7 9 task15 7 9 task16 10 11 task17 10 11 
task18 10 11 task19 10 11 task20 10 12 

我嘗試下面的正則表達式的代碼,試圖檢查格式是否正確,但我只能匹配它的第一個任務屬性。我似乎無法將它與第一項任務相匹配,這意味着當它繼續格式重複的其他任務時,則正則表達式將失敗。任何想法我的正則表達式有什麼問題?

(^\s*[a-zA-Z0-9]*\s+\d+\s+\d+\s*){1,} 

^開始與任何空間\s* 0次或多次

[a-zA-Z0-0]*是字母數字0次或多次,指的是任務

\s+是白色空間之間的不同任務屬性

\d+是到貨時間和截止時間

\s*與白色空間

{1,}不同任務之間0次或多次結束()括號後指定重複的最小數目是1時,與最大重複

沒有指定數目

回答

2

問題是^這需要匹配在輸入序列的開始處,除第一個匹配之外的任何一個都不會滿足該條件。

嘗試的第一部分移動到組外:

^\s*([a-zA-Z0-9]*\s+\d+\s+\d+\s*){1,} 

順便說一句,{1,}可以與單個+代替。

另外請注意,這取決於你如何運用正則表達式你要麼不需要^$包裹的表達(例如String.matches()Matcher.matches它做它含蓄地),或者你可能必須這樣做(根據您的需求),例如在結尾處添加$以要求在比賽結束後不允許任何事情發生(如果這會違反您的文件格式)。

如果你想提取匹配,你需要一個稍微不同的方法,即使用Matcher.find()並刪除最後一部分({1,})。