2017-06-22 11 views
-1

PT10HMSのように無効な期間でxmlを取得します(MとSの前に番号がないことに注意してください)。私はこれをファイルを読み込み、継続文字列を文字単位で繰り返し、並んでいる2文字の間に0を挿入することで修正しました(PとTの間を除く)。私はもっ​​と洗練されたソリューションがsedなどの正規表現を使用していたのかどうか疑問に思っていましたか?任意の提案java - 無効な期間を修正してください

+0

文字の前に数字がない文字を削除するのは正しいでしょうか(PとTを除いて)?それは実際には何の違いもありません。 –

答えて

1

ここJavaソリューションのためのアイデアのための

おかげで(確かsedも使用することができます)。

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

は、今私は

PT10H 
を得る:

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

これは

PT10H0M0S 

は個人的に、私は彼らの前に数字を持っていない文字を削除好む生成します

両方の場合において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となります。文字列に少なくとも1桁の数字があることを確認したら、その前に桁のない文字を削除することができます。

ちょうどPTだったのであれば、まだ動作しません。私が理解するように、これは起こらない。その場合は、代わりにifステートメント内でdurationString = PT0S;を使用することをお勧めします。

+1

数字のない文字を取り除くのが好きでしたが、値PTHMSのため無効だったPTを残してしまったので動作しませんでした。私はこれをテストし、それを置き換えることができると思うが、0を挿入するための正規表現は完全に働いたので、私はそれを使用していますありがとう!!ある日、私は正規表現について読んでいく必要があります。 – kevin

+0

良い点!私はこの可能性について考えていたと思うが、答えにそれについて書くのを忘れてしまった。 @kevin –

関連する問題