3

在多种情况下,我发现自己需要捕获格式如下的日期的“日”部分:"YYYY/DD/MM"我的问题是,将正则表达式与捕获组一起使用是否是一个更好的主意,而不是仅在“/”上调用 split " 并且只取数组中的第二项?

从功能上讲,我意识到两者都得到相同的结果。

在内存方面,我意识到他们都在后台使用正则表达式引擎,并且在大多数情况下,我只是在使用 split 读取一天的值后丢弃数组。Match但从技术上讲,我在读取对象后也会做同样的事情。我正在寻找是否有任何极端情况和权衡我应该考虑我不是?(除了可读性......“分裂”显然在那里获胜......)

===EDIT=== API 方面,出于愚蠢的遗留原因,我仅限于 Groovy 1.5.0。

澄清edmastermind的解决方案:

def nowCal = Calendar.instance 
def currentDay = nowCal.get(Calendar.DAY_OF_MONTH)
4

6 回答 6

2

如果它的格式始终相同,我会使用 String 的 substring 方法来提取您想要的内容。每次使用 REGEX 时都必须对其进行解析。

于 2012-05-25T12:24:26.133 回答
2

如果您使用 DateFormat,则该代码更有意义,setDateFormat 与字符串的格式,然后解析为 Date 对象。性能方面,可能比您的方法有更多的开销。

但是,我想指出:
如果您可以信任输入字符串,那么您可以使用任何您想要的结果来获得结果。
如果你不能,那么只需使用 DateFormat 来解析日期字符串。

于 2012-05-25T12:24:29.143 回答
2

在 Groovy 中,您可以这样做:

def date = '2012/05/25'

assert 25 == Date.parse( 'yyyy/MM/dd', date )[ Calendar.DAY_OF_MONTH ]

对于 Groovy 1.5.0,这将是(包装为函数):

int getDay( String date, String format='yyyy/MM/dd' ) {
  Calendar.instance.with {
    time = new java.text.SimpleDateFormat( format ).parse( date )
    get( Calendar.DAY_OF_MONTH )
  }
}

def date = '2012/05/25'
assert 25 == getDay( date )
于 2012-05-25T13:10:05.717 回答
1

对于这种情况,您应该选择产生最具可读性和可维护性代码的解决方案,所以我会选择这种.split方法而不是正则表达式方法。

考虑几个月后,日期的格式会发生变化。这意味着您必须对正则表达式进行细微的更改。尽管这可能不是一项艰巨的任务,但对于那些接触过正则表达式的人来说,这可能不是那么简单。

对于这种情况,.split("//")在这种情况下非常直观,因此没有正则表达式经验的人更容易理解和维护。

于 2012-05-25T12:24:52.950 回答
1

如果您需要使用最少的资源来完成此操作,请考虑使用 String#indexOf 和 String#substring。同样重要的是要注意,进行基准测试将帮助您做出正确的决定。

我认为在这件事上使用正则表达式非常简洁,并且表明您只对中间部分感兴趣,拆分版本更难阅读,因为您不知道拆分返回多少元素,除非您将其编码为评论。

简单的正则表达式方法和拆分方法都不会为您提供正确的日期验证。为此,请尝试考虑使用 DateFormat 的解析函数。这可能是最慢的。

于 2012-05-25T12:26:26.057 回答
1

注意到 java 标签,调用DAY_OF_MONTH来获取“day”部分而不是正则表达式或拆分它是否可行?

于 2012-05-25T16:07:34.800 回答