正则表达式|用冒号匹配单词,但忽略类似时间的模式

时间:2018-07-30 12:37:38

标签: javascript php regex

对于构建更好,更智能的PDO语句的特殊功能,我已经匹配并提取了每个以冒号开头的单词。

PHP像Needle一样/:\w+/

但是有时候我不得不处理冒号分隔的数字字符串。 (时间值)

  • 2018-05-21T00:00:00+02:00
  • 00:00:00
  • 00:00

我试图排除它们,但是当我尝试为此扩展正则针时却没有成功。由于这个问题,我只是经常解决此问题。但是现在我想修复并了解如何解决此问题。

条件听起来很简单

  1. 查找每个以冒号开头的单词。
  2. 删除所有在冒号前有数字的匹配项。

:\w+的当前结果来看:

  

:light at 07 :15:0000

我只想匹配:

  

:light在07:15:0000

2 个答案:

答案 0 :(得分:2)

您无需使用"/:\w+/",而可以使用"/:[a-zA-Z]+/"来捕获时间。

答案 1 :(得分:2)

如果:之后的那些子字符串不能以数字开头,则可以使用

:[A-Za-z_]\w*

请参见regex demo

在这里

  • :-冒号
  • [A-Za-z_]-一个字母或_(如果第一个字符只能是一个字母,则删除_
  • \w*-0个字母,数字或/和_

替代

您还可以匹配那些类似时间的字符串,并匹配和捕获 :\w+

\d+:\d+(?::\d+)?|(:\w+)

请参见regex demo。如果组1匹配,则仅获取组1的值。

在PHP中,您可以使用SKIP-FAIL正则表达式来完全实现所需的功能:

'~\d+:\d+(?::\d+)?(*SKIP)(*F)|:\w+~'

请参见another demo

使用(*SKIP)(*F),您可以匹配和跳过匹配项,同时匹配其他替代项。