Java正则表达式以SimpleDataFormat模式检测时区

Java正则表达式以SimpleDataFormat模式检测时区,java,regex,timezone,pattern-matching,simpledateformat,Java,Regex,Timezone,Pattern Matching,Simpledateformat,假设一个应用程序使用一些已知的simpleDataFormat模式每秒解析数千个日期字符串。应用程序需要动态地确定每个这样的日期模式是否具有时区,即日期模式字符串是否包含大写或小写的字母Z或X(即总共4个符号) 此类日期模式的示例如下: yyyy/MM/dd HH:MM:ss.SSS Z//时区(不引用Zsymbol) yyyy/MM/dd HH:MM:ss.SSS'Z'//无时区(引用Zsymbol) EEE MMM dd HH:mm:ss x yyyy//时区(不引用xsymbol) EE

假设一个应用程序使用一些已知的
simpleDataFormat
模式每秒解析数千个日期字符串。应用程序需要动态地确定每个这样的日期模式是否具有时区,即日期模式字符串是否包含大写或小写的字母
Z
X
(即总共4个符号)

此类日期模式的示例如下:

  • yyyy/MM/dd HH:MM:ss.SSS Z//时区(不引用
    Z
    symbol)
  • yyyy/MM/dd HH:MM:ss.SSS'Z'//无时区(引用
    Z
    symbol)
  • EEE MMM dd HH:mm:ss x yyyy//时区(不引用
    x
    symbol)
  • EEE MMM dd HH:mm:ss'x'yyyy//无时区(引用
    x
    symbol)
一种方法是使用
String
类的
indexOf()
方法,但这意味着在每个日期模式上运行该方法4次(如果日期模式字符串事先转换为大写或小写,则运行2次),并检查时区符号是否被引用(在这种情况下,模式实际上没有时区)

另一种选择是使用java正则表达式,如

String date = ... // Get a SimpleDateFormat pattern

Pattern timezone = Pattern.compile("[^ZzXx]+[^'\"][ZzXx]{1}.*");

if (timezone.matcher(date).matches())
{
    // The date pattern does have a timezone
}
上述正则表达式是否有更快的版本,例如

  • “[^ZzXx]+[^'\“][ZzXx]{1}.*”

或者任何其他更快的方法,通常用于检查
SimpleDateFormat
模式是否包含时区符号?

我建议尽可能简单:

String string = "...";

Pattern p = Pattern.compile("\\b(?<!')([xXzZ])(?!')\\b");
Matcher m = p.matcher(string);
if (m.find()) {
  String timeZone = m.group(1);
}
String字符串=“…”;

Pattern p=Pattern.compile(\\b(?我建议尽可能简单:

String string = "...";

Pattern p = Pattern.compile("\\b(?<!')([xXzZ])(?!')\\b");
Matcher m = p.matcher(string);
if (m.find()) {
  String timeZone = m.group(1);
}
String字符串=“…”;

Pattern p=Pattern.compile(“\\b(?Before ask)”是否有更快的方法执行此操作“您必须首先询问”我的应用程序在一开始是否存在性能问题?"您可以先将模式设置为一个
静态
属性,这样就不需要每次都对其进行编译…因为这似乎是一个非常低级的优化,您可能应该分析典型的输入数据,并提供场景频率的统计信息。
SimpleDateFormat
非常慢,因此需要花费一些精力来实现找到某种方法来检查字符串中是否有不带引号的
X
/
Z
,相比之下,这种方法非常糟糕,以至于速度非常慢。我正在进行大量优化(包括SimpleDataFormat和模式缓存)这与问题无关。但是,正则表达式似乎不是最优的,因此,如果这是一条可行之路,那么更快版本的正则表达式就足够作为答案了。:-)在问“有没有更快的方法可以做到这一点”之前,你必须先问“我的应用程序一开始是否存在性能问题?”您可以先将模式设置为一个
静态
属性,这样就不需要每次都对其进行编译…因为这似乎是一个非常低级的优化,您可能应该分析典型的输入数据,并提供场景频率的统计信息。
SimpleDateFormat
非常慢,因此需要花费一些精力来实现找到某种方法来检查字符串中是否有不带引号的
X
/
Z
,相比之下,这种方法非常糟糕,以至于速度非常慢。我正在进行大量优化(包括SimpleDataFormat和模式缓存)这与问题无关。然而,正则表达式似乎不是最优的,因此如果这是一条可行之路,那么更快的版本就足以作为答案了。:-)嗯…它不起作用,正如find()一样根据我在问题中的示例,甚至匹配引用的时区符号,如“Z”/是。我的正则表达式具有回溯功能,因为第二个字符类是第一个字符类的子集。你确定你的解决方案更快吗?@PNS-我相信是的…祝你好运!嗯…它不起作用,因为find()根据我在问题中的示例,甚至匹配引用的时区符号,如“Z”/是。我的正则表达式具有回溯功能,因为第二个字符类是第一个字符类的子集。你确定你的解决方案更快吗?@PNS-我相信是的……祝你好运!