2016-09-26 10 views
2

私はJavaプログラムを書いています。プログラムでは、ユーザーから時間を入力しています。入力を文字列として取り、それがパターンと一致するかどうかを確認します。私が望むパターンはフォーマットです:10:15 AM時間マッチングの仕方正規表現パターン

これは私が試みたものですが、うまくいかないようです。

public static boolean checkTimePattern(String time) { 
    Pattern pattern = Pattern.compile("\\d{1}:\\d{1}^[A]{1}[M]{1}"); 
    if(pattern.matcher(time).matches()){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

ありがとうございます。

+3

正規表現ではなくSimpleDateFormatを使用する – Jens

+0

正規表現で何を確認しようとしていますか? '\ d {1}'は1桁のみを意味し、 '^ [A] {1}'は '^'を意味し、その後は 'A'を意味します。これらすべては意味をなさないし、好みの書式 –

答えて

5

で、画面の一番下にあるガイドラインを確認し終了します。 Javaには、日付/時刻値を含む文字列を解析するメカニズムがすでに用意されています。

正規表現を調べても問題ありませんが、ではなく、はフレームワーク内に既に存在するものに使用します。あなたの解決策はいつもSimpleDateFormatがあなたのためにやっているものと比べて不足しているでしょう!

1
  1. なぜあなたは^を使用していますか?それを使うことはありません。指数は文字列の先頭にアサーション位置を使用していますが、これを使用して時刻と一致することはありません。

  2. 数字は1または2のいずれかの数字です。 \d{1}は、1桁しか存在しないことを示します。代わりに\d{1,2}を使用して、1桁または最大2桁のいずれかを示す必要があります。

  3. [A]によってに従う必要はありません。それはそれ自体が1つの文字とそれがAだということを意味します。 PMのサポートを追加したい場合は、[AP]と、それに続く[M]または単にMを使用してください。

あなたはフォーマットは以下のようになり

\d{1,2}:\d{1,2}\s[AP][M] 

はエスケープこの正規表現を使用することができます。

\\d{1,2}:\\d{1,2}\\s[AP][M] 

DEMO

+0

と一致しません。文字通り '^'にマッチさせるために、文字列の真ん中にあれば、エスケープする必要なしに単に '^'を使うことができます。 2. "Regex"の文脈では、数字は '\\ d'の代わりに' \ d'(Java文字列リテラルによって引き起こされるエスケープ)でなければなりません3。最後の 'M 'に' [] 'は必要ありません。 –

+0

@AdrianShum通知してくれてありがとう、私はそれに応じて私の答えを更新しました。 –

-1

あなたがしようと、最初にあなたの正規表現をテストする必要がありhttp://rubular.com/

\d{2}[:]\d{2}\s*[A][M] //should work, this is the general regex 

^置くいけないが、文字列の先頭を意味途中で、($の手段は、単に右そこに停止rubular.com

+0

間違っています。 '^'とは、文字通り '^'を意味します。 –

+0

は、文字通り@adrian shumを意味しませんでした。 –

2

あなたの正規表現は1時間桁と1分桁しか許さず、Aの前に文字列の開始が必要です。それはほとんど意味がありません。

時間(または日付)を検証するための最良の方法、SimpleDateFormat使用:あなたは正規表現を使用するようにバインドされている場合は、

String s = "10:15 AM"; 
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a"); 
sdf.setLenient(false); 
try { 
    Date dt2 = sdf.parse(s); 
    System.out.println(dt2); 
} 
catch (Exception exc) { 
    System.out.println(s + " IS NOT VALID TIME"); 
} 

//Regex 
String pat = "[0-1]?[0-2]:[0-5][0-9]\\s*[Aa][Mm]"; 
if (s.matches(pat)){ 
    System.out.println("Regex matches the string!"); 
} 

[0-1]?[0-2]マッチ012時間を使い、 [0-5][0-9]は、059分に一致し、\\s*は0以上の空白に一致し、[Aa][Mm]はと一致します,AM,aMまたはamである。大手0が必要な場合は、[0-1]後から?を削除。)

Java demo

+0

FYI:時刻と 'AM'の間に*正確に1つの空白がなければならない場合は、' \ \ s'です。 –

1

を参照してくださいあなたが正規表現に

1を使用していた間、正しくあなたが理解されていないものがいくつかあります。 )^は正規表現によって予約されている文字なので、使用するときはエスケープする必要があります。ここでは間違って使用されていますが、作業したい場合はバックスラッシュ()を使用してエスケープします。

  \\d{1}:\\d{1}\^[A]{1}[M]{1}      <- Watch carefully \^ 

2)@GhostCat adviceが正しい

だから、式( INCORRECT まだもののしかし、このようにされているはずです)、ここで使用してSimpleDateFormat。

3.)正規表現を引き続き使用する場合は、パターンと一致するように見えるはずです。

 \\d{2}:\\d{2}\\s+(AM|PM) 

今部によってを正規表現の部分を理解\\ D {2} - >これは、二桁正確

言う: - >これはAと言います2桁後のコロン。

\\ D {2} - >これは言う正確コロンの後の2桁

\\ S + - >これはないいずれにも一致し言います。 XX:XXの後にスペース文字を使用すると、正規表現をより堅牢にするためにスキップすることができます。

(AM | PM) - >これはキャプチャグループで、AMまたは(|)PMと一致するとは限りません。