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"

这些字符串是来自名为“schedule”的表列的数据库值。我只有读取权限,所以无法更改数据,而且数据库很大,很难更改计划列的格式。

我的目的是从返回日期(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 回答
0

这是另一种方式:

String regex = "(?<=am|pm),?-?|(?<=[A-Z])(?=[0-9])";
System.out.println(Arrays.toString(str.replaceAll(" ", "").split(regex)));

因为"MTWHFS 02:30 pm-04:00 am W 08:30 am-10:00 am"它打印:

[MTWHFS, 02:30pm, 04:00am, W, 08:30am, 10:00am]

解释:

split如果您还没有玩过并且可能已经有点正则表达式,可能会有点难以理解。

首先,用 . 删除所有空格replaceAll

然后是正则表达式

(?<=am|pm)检查前面的字符是否为amor pm,然后您还包括一个可选字符,-因此这些字符在拆分中使用。

或者,前一个字符必须介于 A 和 Z ( (?<=[A-Z])) 之间,下一个字符必须介于 0 和 9 ( (?=[0-9])) 之间。

例子:

MH02:30pm-04:00pm
  ^ here the previous character is "H" and the next character is "0",
     thus it fulfils the second condition, it splits on a string of length 0

MH02:30pm-04:00pm
         ^ here the previous characters are "pm",
            thus it fulfils the first condition, it splits on the "-"
于 2013-07-25T08:56:47.633 回答