【问题标题】:RegEx | Match words with colons but ignore time-like patterns正则表达式 |匹配带有冒号的单词,但忽略类似时间的模式
【发布时间】:2018-07-30 12:37:37
【问题描述】:

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

PHP 像针/:\w+/

但有时我也必须处理带有冒号分隔数字的字符串。 (时间价值)

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

我试图排除它们,但当我试图为此扩展我的正则表达式时从未成功。由于这个问题,我经常解决这个问题。但现在我想修复并了解如何解决这个问题。

情况听起来很简单

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

所以从:\w+的当前结果来看:

:light 07:15:0000

我只想匹配:

:light 07:15:0000

【问题讨论】:

  • 是 PHP 还是 JS 还是两者兼而有之?你是提取还是替换?如果第一个字符不能是数字,请尝试 :[A-Za-z_]\w*
  • /:[^\d\s]+/ 试试这个
  • @bassxzero 这匹配空格

标签: javascript php regex


【解决方案1】:

如果:之后的子串不能以数字开头,你可以使用

:[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),您可以匹配和跳过匹配项,同时匹配其余选项。

【讨论】:

  • 有趣的是,我无法像你们(Wiktor,Andreas)建议的那样考虑最简单的解决方案:使用字符范围而不是单词匹配。谢谢!
【解决方案2】:

您不需要使用"/:\w+/",您可以使用不会捕获时间的"/:[a-zA-Z]+/"

【讨论】:

  • 有趣的是,我无法像你们(Wiktor,Andreas)建议的那样考虑最简单的解决方案:使用字符范围而不是单词匹配。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 2017-04-28
  • 2012-07-24
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多