1

文字列の区切りに問題があります。これらは私が持っている生の文字列です

"MH 02:30pm-04:00pm TF 08:30am-10:00am"
"MTWS 07:00 am-09:00 am, A 08:30 am-11:00 am"
"WS 01:00pm-05:00pm F 11:30am-01:00pm"

これらの文字列は、「スケジュール」という名前のテーブル列からのデータベース値です。私は読み取り権限しか持っていないのでデータを変更することはできません。また、データベースが巨大であるため、スケジュール列の形式を変更することは困難です。

私の目的は、日 (MTWHFSA)、開始時刻、および終了時刻を返す文字列からクラス スケジュールを抽出することです。これまでに行ったことは、StringTokenizer を使用することです。ご覧のとおり、データベースが返す文字列の形式がさまざまであるため、成功していません。常に同じ形式を返すとは限りません。したがって、すべてが同じ形式になるように、すべての空白を削除することを考えました。例:

"MH02:30pm-04:00pmTF08:30am-10:00am"

上記の文字列から日(MTWHFSA)、開始時刻、終了時刻を抽出する方法を教えてください。

サンプルコードは次のとおりです。

String sched = "MTWHFS 02:30pm-04:00am W 08:30am-10:00am";
StringTokenizer token = new StringTokenizer(sched,",");
    while(token.hasMoreTokens()){
        StringTokenizer anotherToken = new StringTokenizer(token.nextToken(),"\\ ?\\-?");
        while(anotherToken.hasMoreTokens()){
            System.out.println(anotherToken.nextToken());
        }
    }

これは正しく出力されます:

MTWHFS
02:30pm
04:00am
W
08:30am
10:00am

しかし、文字列が次のような場合:

String sched = "MTWHFS 02:30 pm-04:00 am W 08:30 am-10:00 am";

出力は次のようになります。

MTWHFS
02:30
pm
04:00
am
W
08:30
am
10:00
am

文字列形式が異なると出力が異なるため、文字列形式が同じになるように空白を削除しました。

しかし、文字列に次のような空白がない場合:

String sched = "MTWHFS02:30pm-04:00amW08:30am-10:00am";

これは私が望んでいたものではありません。

MTWHFS02:30pm
04:00amW08:30am
10:00am

この文字列が次のようになるように、誰でもこれを手伝ってもらえますか:

String sched = "MTWHFS02:30pm-04:00amW08:30am-10:00am";

出力します:

MTWHFS
02:30pm
04:00am
W
08:30am
10:00am

ありがとう。

4

2 に答える 2

3

正規表現を使用できます。正規表現を使用する利点は、入力が期待される形式であるかどうかもチェックすることです。

この正規表現は、単一のスケジュール エントリと一致する必要があります。

([A-Z]+)([0-9]{2}:[0-9]{2}(?:am|pm))-([0-9]{2}:[0-9]{2}(?:am|pm))

正規表現のキャプチャ グループは、日付、開始時刻、終了時刻を示します。次のように Java で使用できます。

// the input string which may contain spaces
String s = "MH02:30pm-04:00pmTF08:30am-10:00am"; 
s = s.replaceAll("\\s+", ""); //remove the spaces
Pattern rg = Pattern.compile("([A-Z]+)([0-9]{2}:[0-9]{2}(?:am|pm))-([0-9]{2}:[0-9]{2}(?:am|pm))");
final Matcher matcher = rg.matcher(s);
while(matcher.find()) {
    //find all the groups
    for(int i=0;i<=matcher.groupCount();i++) {
        System.out.println(matcher.group(i));
    }
}
于 2013-07-25T08:22:44.033 に答える