在Java中,如何使用方括号作为分隔符来解析字符串?

在Java中,如何使用方括号作为分隔符来解析字符串?,java,split,zoneddatetime,Java,Split,Zoneddatetime,我有一个类,它使用.split()解析ZoneDateTime对象,以消除我不需要的所有额外信息 我的问题:是否有一种方法可以使用方括号作为我缺少的分隔符,或者如何在不使用方括号作为分隔符的情况下单独获取时区([US/Mountain]) 我希望字符串时区看起来像“US/Mountian”或“[US/Mountian] 我所尝试的: 我试过wholeThing.split([[-T:.]]?)和wholeThing.split([%[-T:.%]])但它们都给了我00[US/Mountain]

我有一个类,它使用
.split()
解析ZoneDateTime对象,以消除我不需要的所有额外信息

我的问题:是否有一种方法可以使用方括号作为我缺少的分隔符,或者如何在不使用方括号作为分隔符的情况下单独获取时区([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()
是正确的想法

String[] timeZoneTemp = wholeThing.split("\\[");
String timeZone = timeZoneTemp[1].substring(0, timeZoneTemp[1].length() - 1);

如果您想自己解析字符串,请使用正则表达式来提取值

不要使用正则表达式来查找要拆分的字符,这就是它的作用

相反,使用带有捕获组的正则表达式,使用编译它,使用获取输入文本上的一个值,并使用检查它

如果匹配,您可以使用获取捕获的组

正则表达式示例:

(\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 **");
}
输出

年份:2016年
月份:09
日期:28
时间:17
分钟:38
秒:38
分数:990
时区:美国/山区

已更新

当然,您可以使用获得所有相同的值,这也将确保日期是有效的,这是其他解决方案无法做到的

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());
输出

年份:2016年
月份:9
日期:28
时间:17
分钟:38
秒:38
米莉:990
时区:美国/山区

如果要自己解析字符串,请使用正则表达式提取值

不要使用正则表达式来查找要拆分的字符,这就是它的作用

相反,使用带有捕获组的正则表达式,使用编译它,使用获取输入文本上的一个值,并使用检查它

如果匹配,您可以使用获取捕获的组

正则表达式示例:

(\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 **");
}
输出

年份:2016年
月份:09
日期:28
时间:17
分钟:38
秒:38
分数:990
时区:美国/山区

已更新

当然,您可以使用获得所有相同的值,这也将确保日期是有效的,这是其他解决方案无法做到的

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());
输出

年份:2016年
月份:9
日期:28
时间:17
分钟:38
秒:38
米莉:990
时区:美国/山区

ZonedDateTime字符串的解析方法如下:…
ZonedDateTime.parse()
?---无论如何,您的问题不清楚您想要什么输出。您想要时区字符串是什么?
-06:00
US/Mountain
?请澄清。--但是,最好使用正则表达式,而不是尝试使用
split()
,即使用
图案
匹配器
,因此您可以使用
组(x)获得适当的碎片
method。如果您不知道正则表达式,现在是学习的时候了。请澄清,您希望能够从字符串中获取时区?编辑为clarify@andreas因为我想自己练习,而且因为ZoneDateTime.parse()没有给我想要的东西。我的类会给我,除了我一直坚持的这一部分。好奇的是:
ZonedDateTime.parse()
没有给你想要的东西吗?你为什么不使用…
ZonedDateTime.parse()解析这样的ZonedDateTime字符串呢
?---无论如何,您的问题不清楚您想要什么输出。您想要时区字符串是什么?
-06:00
US/Mountain
?请澄清。--但是,最好使用正则表达式,而不是尝试使用
split()
,即使用
图案
匹配器
,因此您可以使用
组(x)获得适当的碎片
method。如果您不知道正则表达式,现在是学习的时候了。请澄清,您希望能够从字符串中获取时区?编辑为clarify@andreas因为我想自己练习,而且因为ZoneDateTime.parse()没有给我想要的。我的类会给我,除了我一直坚持的这一部分。好奇的是:
ZoneDateTime.parse()
以什么方式没有给你想要的?如果你只是在查找
[
character,然后在正则表达式上进行拆分是一种过分的做法。请改用
indexOf(“[”)
。更快更清楚地说明意图。如果您只是在查找
[
character,然后在正则表达式上拆分是一种过分的做法。请改用
indexOf(“[”)
。在意图上更快更清晰。感谢ZonedDateTime.parse()例如,我找不到一个合适的。可能没有这样的例子,因为您可以通过查看
ZoneDateTime
,轻松找到信息。感谢您提供的ZoneDateTime.parse()例如,我找不到一个合适的。可能没有这样的例子,因为您可以通过查看
ZoneDateTime
的。