1

我有以下字符串[datetime:yyyyMMddhhmmss],我想用正则表达式对其进行一些检查。我知道我可以通过多个正则表达式匹配来做到这一点,但如果可能的话,我希望(学习)在 1 个表达式中做到这一点。该字符串还可能包含破折号/连字符和下划线,如 so [datetime:yyyy_MM_dd_hh-mm-ss]。空格被前面的代码删除。并且日期时间说明符组(像 yyyy 这样的组)可以放在 after[datetime:和 before格式中的某个位置]。所以这也是一个有效的格式:[datetime:dd_MM_yyyy_hh-mm-ss]

要做的检查:

  • 我想确保 [datetime:] 存在。我可以使用模式\[datetime:[\w\-]+\]
  • 我想确保 6 组 yyyy MM dd hh mm ss 存在,但它们可能以随机顺序出现。

我试图用积极的前瞻/后视来做到这一点,\[datetime:[\w\-]+(?<=.?M{2}.?)\]以匹配代码中某处 MM 的存在。但这不起作用。

任何可以帮助我的正则表达式大师?

解决方案:

根据 Bergi 的回答,我现在有了这个正则表达式模式:\[datetime:(?=.*?y{4})(?=.*?M{2})(?=.*?d{2})(?=.*?h{2})(?=.*?m{2})(?=.*?s{2})[\w\-]+\]可以完成这项工作。因为它匹配以下所有给定的模式:

  • [日期时间:yyyyMMddhhmmss]
  • [日期时间:mmssyyyyddMMhh]
  • [日期时间:mm_ss-yyyy_dd-MM-hh]
  • [日期时间:mmssyyyyddMM_hours_hh]

并不是所有上述模式都有意义,但这正是我想要的!

4

2 回答 2

1

我试图用积极的前瞻/后视来做到这一点,\[datetime:[\w\-]+(?<=.?M{2}.?)\]以匹配代码中某处 MM 的存在。但这不起作用。

Lookbehinds 使用起来很麻烦,因为它们在不同引擎的多个级别上受到限制(如果完全支持的话)。此外,您当前的代码要求 MM 包含在日期时间字符串的最后三个字符中,这似乎不是您想要的(没有后视的等价物:)\[datetime:[\w\-]*M{2}[\w\-]?\]

更好地使用前瞻:

\[datetime:(?=.*?y{4})(?=.*?M{2})(?=.*?d{2})…[\w\-]+\]
于 2013-03-28T12:04:26.237 回答
0

\[datetime:[\w\-]+(?<=.?M{2}.?)\]在代码中的某处匹配 MM 的存在。但这不起作用。

[\w\-]+匹配到输入的末尾,因此前瞻将没有可匹配的内容。

为什么不试试:

\[日期时间:(?<=.*M{2})[\w\-]+\]

IE。theM{2}是在:结尾之后和之前的任何地方]

但最后,您的:

如果可能的话,用 1 个表达式来做

可能会使这更难维护。更容易使用字符串操作来显式匹配前缀[datetime:和后缀,]然后String.IndexOf在其余部分中的每个元素上使用。

于 2013-03-28T11:34:11.177 回答