2017-06-22 48 views
-1

我們得到xml的持續時間無效,如PT10HMS(注意M和S之前缺少數字)。我通過讀取文件並通過逐個字符地迭代持續時間字符串並在兩個並排的字母(P和T之間除外)之間插入0來解決此問題。我想知道是否有一個更優雅的解決方案,可能使用sed或其他東西的正則表達式?java - 修復一個無效的持續時間

感謝您的任何建議

+0

刪除前面沒有數字的字母(再次除了P和T)是不是更正確?並不是說它在實踐中有任何不同。 –

回答

1

這裏一個Java解決方案的想法(確信sed可得使用)。

String incorrectDuration = "PT10HMS"; 
    String dur = incorrectDuration.replaceAll("(?<!\\d+)[HMS]", "0$0"); 

這將產生

PT10H0M0S 

個人而言,我寧願刪除那些沒有在他們面前的一些字母:

String dur = incorrectDuration.replaceAll("(?<!\\d+)[HMS]", ""); 

現在,我得到

PT10H 

在這兩種情況下Duration.parse(dur)的作品,並給出了預期的結果。

(?<!\\d+)是一個負向lookbehind:與此正則表達式匹配,如果H,M或S沒有前面有一串數字。

編輯:我可能在下面做得過度。正如你在評論中提到的那樣,如果你有例如PTHMS,我只是好奇我怎樣才能生成我的首選字符串。對於生產代碼,您可能想要堅持上面更簡單的解決方案。

String durationString = "PTHMS"; 
    // if no digits, insert 0 before last letter 
    if (! durationString.matches(".*\\d.*")) { 
     durationString = durationString.replaceFirst("(?=[HMS]$)", "0"); 
    } 
    // then delete letters that do not have a digit before them 
    durationString = durationString.replaceAll("(?<!\\d)[HMS]", ""); 

這產生

PT0S 

(?=[HMS]$)是一個超前。它匹配空字符串,但前提是該空字符串後跟H,M或S,然後是字符串結尾。所以用0替換這個空字符串給我們PTHM0S。確信字符串中至少有一位數字,我們可以繼續刪除在他們之前沒有數字的字母。

如果你只是PT它仍然不會工作。據我所知,這不會發生。如果是這樣,那麼您應該在if語句中改爲使用durationString = PT0S;

+1

我喜歡擺脫沒有數字的字母,但那不起作用,因爲對於一個價值PTHMS它離開了PT,這是無效的。我想我可以測試這個並替換它,但插入0的正則表達式工作完美,所以我使用它謝謝!有一天,我將不得不閱讀正則表達式。 – kevin

+0

好點!我想我想過這種可能性,但後來忘了在答案中寫下來,對不起。 @kevin –