如何在 Java 中使用方括号作为分隔符解析字符串?
How can I parse string using square brackets as a delimiter in Java?
我有一个 class,它使用 .split()
解析 ZonedDateTime 对象,以删除我不需要的所有额外信息。
我的问题:有没有办法使用方括号作为我缺少的分隔符,或者我如何获得时区 ([US/Mountain])单独使用而不使用方括号作为分隔符?
我希望字符串时区看起来像 "US/Mountian" 或 "[US/Mountian]
我尝试过的:
我试过 wholeThing.split("[[-T:.]]?)
和 wholeThing.split("[%[-T:.%]]")
但那些都给了我 00[US/Mountain]
我也试过 wholeThing.split("[\[-T:.\]])
和 wholeThing.split("[\[-T:.\]")
,但那些只是给我错误。
(部分)我的代码:
//We start out with something like 2016-09-28T17:38:38.990-06:00[US/Mountain]
String[] whatTimeIsIt = wholeThing.split("[[-T:.]]"); //wholeThing is a TimeDateZone object converted to a String
String year = whatTimeIsIt[0];
String month = setMonth(whatTimeIsIt[1]);
String day = whatTimeIsIt[2];
String hour = setHour(whatTimeIsIt[3]);
String minute = whatTimeIsIt[4];
String second = setAmPm(whatTimeIsIt[5],whatTimeIsIt[3]);
String timeZone = whatTimeIsIt[8];
使用split()
是正确的想法。
String[] timeZoneTemp = wholeThing.split("\[");
String timeZone = timeZoneTemp[1].substring(0, timeZoneTemp[1].length() - 1);
如果您想自己解析字符串,请使用正则表达式提取值。
不要使用正则表达式来查找要拆分的字符,split()
就是这样做的。
相反,使用带有捕获组的正则表达式,使用 Pattern.compile()
, obtain a Matcher
on your input text using matcher()
, and check it using matches()
编译它。
如果匹配,您可以使用 group()
.
获取捕获的组
正则表达式示例:
(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d+)[-+]\d{2}:\d{2}\[([^\]]+)\]
在 Java 字符串中,您必须对 \
进行转义,所以这里是显示其工作原理的代码:
String input = "2016-09-28T17:38:38.990-06:00[US/Mountain]";
String regex = "(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d+)[-+]\d{2}:\d{2}\[([^\]]+)\]";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.matches()) {
System.out.println("Year : " + m.group(1));
System.out.println("Month : " + m.group(2));
System.out.println("Day : " + m.group(3));
System.out.println("Hour : " + m.group(4));
System.out.println("Minute : " + m.group(5));
System.out.println("Second : " + m.group(6));
System.out.println("Fraction: " + m.group(7));
System.out.println("TimeZone: " + m.group(8));
} else {
System.out.println("** BAD INPUT **");
}
输出
Year : 2016
Month : 09
Day : 28
Hour : 17
Minute : 38
Second : 38
Fraction: 990
TimeZone: US/Mountain
已更新
您当然可以使用 ZonedDateTime.parse()
获得所有相同的值,这也将确保日期 有效 ,另一个 none解决方案就可以了。
String input = "2016-09-28T17:38:38.990-06:00[US/Mountain]";
ZonedDateTime zdt = ZonedDateTime.parse(input);
System.out.println("Year : " + zdt.getYear());
System.out.println("Month : " + zdt.getMonthValue());
System.out.println("Day : " + zdt.getDayOfMonth());
System.out.println("Hour : " + zdt.getHour());
System.out.println("Minute : " + zdt.getMinute());
System.out.println("Second : " + zdt.getSecond());
System.out.println("Milli : " + zdt.getNano() / 1000000);
System.out.println("TimeZone: " + zdt.getZone());
输出
Year : 2016
Month : 9
Day : 28
Hour : 17
Minute : 38
Second : 38
Milli : 990
TimeZone: US/Mountain
我有一个 class,它使用 .split()
解析 ZonedDateTime 对象,以删除我不需要的所有额外信息。
我的问题:有没有办法使用方括号作为我缺少的分隔符,或者我如何获得时区 ([US/Mountain])单独使用而不使用方括号作为分隔符?
我希望字符串时区看起来像 "US/Mountian" 或 "[US/Mountian]
我尝试过的:
我试过 wholeThing.split("[[-T:.]]?)
和 wholeThing.split("[%[-T:.%]]")
但那些都给了我 00[US/Mountain]
我也试过 wholeThing.split("[\[-T:.\]])
和 wholeThing.split("[\[-T:.\]")
,但那些只是给我错误。
(部分)我的代码:
//We start out with something like 2016-09-28T17:38:38.990-06:00[US/Mountain]
String[] whatTimeIsIt = wholeThing.split("[[-T:.]]"); //wholeThing is a TimeDateZone object converted to a String
String year = whatTimeIsIt[0];
String month = setMonth(whatTimeIsIt[1]);
String day = whatTimeIsIt[2];
String hour = setHour(whatTimeIsIt[3]);
String minute = whatTimeIsIt[4];
String second = setAmPm(whatTimeIsIt[5],whatTimeIsIt[3]);
String timeZone = whatTimeIsIt[8];
使用split()
是正确的想法。
String[] timeZoneTemp = wholeThing.split("\[");
String timeZone = timeZoneTemp[1].substring(0, timeZoneTemp[1].length() - 1);
如果您想自己解析字符串,请使用正则表达式提取值。
不要使用正则表达式来查找要拆分的字符,split()
就是这样做的。
相反,使用带有捕获组的正则表达式,使用 Pattern.compile()
, obtain a Matcher
on your input text using matcher()
, and check it using matches()
编译它。
如果匹配,您可以使用 group()
.
正则表达式示例:
(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d+)[-+]\d{2}:\d{2}\[([^\]]+)\]
在 Java 字符串中,您必须对 \
进行转义,所以这里是显示其工作原理的代码:
String input = "2016-09-28T17:38:38.990-06:00[US/Mountain]";
String regex = "(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d+)[-+]\d{2}:\d{2}\[([^\]]+)\]";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.matches()) {
System.out.println("Year : " + m.group(1));
System.out.println("Month : " + m.group(2));
System.out.println("Day : " + m.group(3));
System.out.println("Hour : " + m.group(4));
System.out.println("Minute : " + m.group(5));
System.out.println("Second : " + m.group(6));
System.out.println("Fraction: " + m.group(7));
System.out.println("TimeZone: " + m.group(8));
} else {
System.out.println("** BAD INPUT **");
}
输出
Year : 2016
Month : 09
Day : 28
Hour : 17
Minute : 38
Second : 38
Fraction: 990
TimeZone: US/Mountain
已更新
您当然可以使用 ZonedDateTime.parse()
获得所有相同的值,这也将确保日期 有效 ,另一个 none解决方案就可以了。
String input = "2016-09-28T17:38:38.990-06:00[US/Mountain]";
ZonedDateTime zdt = ZonedDateTime.parse(input);
System.out.println("Year : " + zdt.getYear());
System.out.println("Month : " + zdt.getMonthValue());
System.out.println("Day : " + zdt.getDayOfMonth());
System.out.println("Hour : " + zdt.getHour());
System.out.println("Minute : " + zdt.getMinute());
System.out.println("Second : " + zdt.getSecond());
System.out.println("Milli : " + zdt.getNano() / 1000000);
System.out.println("TimeZone: " + zdt.getZone());
输出
Year : 2016
Month : 9
Day : 28
Hour : 17
Minute : 38
Second : 38
Milli : 990
TimeZone: US/Mountain