PHP正则表达式非捕获非匹配组

Ben*_*Ben 15 php regex date match preg-match

我正在制作一个匹配正则表达式的日期,而且一切都很顺利,到目前为止我已经得到了这个:

"/(?:[0-3])?[0-9]-(?:[0-1])?[0-9]-(?:20)[0-1][0-9]/"
Run Code Online (Sandbox Code Playgroud)

它(希望)将匹配单个或两位数的日期和月份,以及21世纪的两倍或四倍数字年份.到目前为止,一些试验和错误让我受益匪浅.

但是,关于这些结果,我有两个简单的问题:

  1. (?: )对此有什么简单的解释?显然,这是一个不匹配的群体.但是之后...

  2. 结尾?是什么?例如(? )?

Jos*_*e_X 32

[编辑(再次)改进格式并修复介绍.]

这是一个评论和答案.

答案部分......我同意亚历克斯先前的回答.

  1. (?: )( )与之相反,用于避免捕获文本,通常是为了减少与您想要的文本一起引用的后向引用或提高速度性能.

  2. 的?继(?: )下列任何时除外或- * + ?{}-表示前面的项可以是或可以不是一个合法的匹配内找到.例如,/z34?/将匹配z3以及z34但它不匹配z35或z等.

评论部分......我做了一些可能被认为是对你正在进行的正则表达式的改进:

(?:^|\s)(0?[1-9]|[1-2][0-9]|30|31)-(0?[1-9]|10|11|12)-((?:20)?[0-9][0-9])(?:\s|$)
Run Code Online (Sandbox Code Playgroud)

- 首先,它避免了0-0-2011之类的事情

- 其次,它避免了像233443-4-201154564这样的事情

- 第三,它包括1-1-2022之类的东西

- 第四,它包括1-1-11之类的东西

- 第五,它避免了像34-4-11这样的事情

- 第六,它允许你捕获日,月和年,这样你就可以在代码中更容易地参考这些代码.例如,这些代码会进行进一步的检查(是第二个被捕获的组2并且是首先捕获组29并且这是闰年或者第一个捕获组是<29)以便查看是否有资格29日期合格.

最后,请注意您仍将获得不存在的日期,例如31-6-11.如果你想避免这些,那么试试:

(?:^|\s)(?:(?:(0?[1-9]|[1-2][0-9]|30|31)-(0?[13578]|10|12))|(?:(0?[1-9]|[1-2][0-9]|30)-(0?[469]|11))|(?:(0?[1-9]|[1-2][0-9])-(0?2)))-((?:20)?[0-9][0-9])(?:\s|$)
Run Code Online (Sandbox Code Playgroud)

此外,我假设日期之前和之后是一个空格(或乞讨/结束行),但您可能想要调整它(例如,允许标点符号).

其他地方的评论者引用了您可能会觉得有用的资源:http: //rubular.com/


ale*_*lex 6

  1. 这是一个非捕获组.你不能回来参考它.通常用于整理反向引用和/或提高性能.
  2. 这意味着先前的捕获组是可选的.