代码之家  ›  专栏  ›  技术社区  ›  rmahesh

将这两个正则表达式语句组合成一个语句?

  •  0
  • rmahesh  · 技术社区  · 7 年前

    这个社区在我之前的正则表达式问题上帮了我很大的忙,我确实有一个关于结合这两个正则表达式的问题。

    我的目标是使正则表达式成为:日期或日期时间戳

    时间戳=(\d{1,2})(?:[:]{1})(\d{1,2})(?:[:]{1})(\d{1,2})

    我无法将这两个语句组合成一个正则表达式语句。任何帮助都会很棒!

    2 回复  |  直到 7 年前
        1
  •  2
  •   CAustin    7 年前

    首先,我建议您简化模式。它们包含很多冗余,并且似乎有一些疏忽。

    您的时间戳模式: (\d{1,2})(?:[:]{1})(\d{1,2})(?:[:]{1})(\d{1,2})

    我将继续并假设您确实需要捕获组,以便您可以在程序中返回月/日/年后的数据,但无论如何,没有理由在这个正则表达式中对任何内容进行分组。因此,可以移除非捕捉组。

    (\d{1,2})[:]{1}(\d{1,2})[:]{1}(\d{1,2})

    : 在方括号内,因为它只是一个字符,在括号内和括号外具有相同的含义(与 . {1} 在所有情况下都是多余的。

    (\d{1,2}):(\d{1,2}):(\d{1,2})

    这取决于我个人的意见,但我更喜欢写两次,然后再写一次 ?

    (\d\d?):(\d\d?):(\d\d)

    好多了,对吧?

    (\d{1,2}|[a-zA-Z]{2,8})(?:[/-]{1})(\d{1,2}|[a-zA-Z]{2,8})(?:[/-]{1})(\d*)

    我将快速应用我为第一个模式提到的所有更改。

    (\d\d?|[a-zA-Z]{2,8})[/-](\d\d?|[a-zA-Z]{2,8})[/-](\d*)

    我很好奇你是否真的需要检查第一部分和第二部分中可能由字母组成的字符串。通常是一个或另一个取决于地区,但很少在同一个程序中两者的混合。我将继续删除第二个部分,检查这一点,但当然,如果需要,请继续添加它。无论如何 \d* 最后看起来这可能是个问题。我怀疑您是否希望年份由0、1或超过4位数字组成。

    (\d\d?|[a-zA-Z]{2,8})[/-](\d\d?)[/-](\d{2,4})

    (您可能也不希望年份由3位数字组成,但这可能已经足够好了。)

    | .

    (\d\d?|[a-zA-Z]{2,8})[/-](\d\d?)[/-](\d{2,4})|(\d\d?):(\d\d?):(\d\d)

    :

    (\d\d?|[a-zA-Z]{2,8})[:/-](\d\d?)[:/-](\d{2,4})

    July:23-1999 。分隔符之间的潜在不匹配在“日期”模式中已经有点固有,但现在由于添加了 :

    (\d\d?|[a-zA-Z]{2,8})([:/-])(\d\d?)\2(\d{2,4})

    但是,请注意,这将更改捕获组的顺序,因此如果程序依赖于1、2和3,则现在需要使用1、3和4。

    https://regex101.com/r/cRAw1Y/1

        2
  •  1
  •   Izaak Weiss    7 年前

    final = '(' + date + ')|(' + date + ')(' + timestamp ')'

    如果我们还假设有一个正则表达式作为日期和时间戳之间的分隔符,我们可以使用

    final = '(' + date + ')|((' + date + ')(' + separator + ')(' + timestamp + '))'