我在分隔字符串时遇到问题。 这些是我拥有的原始字符串
"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
感谢。
答案 0 :(得分:3)
您可以使用正则表达式。使用正则表达式的好处是它还会检查输入是否具有预期的格式。
此正则表达式应匹配单个计划条目:
([A-Z]+)([0-9]{2}:[0-9]{2}(?:am|pm))-([0-9]{2}:[0-9]{2}(?:am|pm))
正则表达式中的capture groups为您提供日期,开始和结束时间。你可以在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));
}
}
答案 1 :(得分: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
删除所有空格。
然后它进入regular expression。
(?<=am|pm)
会检查以前的字符是am
还是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 "-"