当前位置: 首页 > 知识库问答 >
问题:

正则表达式匹配错误的可选组

金昂熙
2023-03-14

我正在尝试匹配时间格式。时间可以用可选的小时、分钟和毫秒写入。唯一需要的值是秒。所以所有这些时间都写得正确,应该匹配。

10:11:12.123 '10 hours, 11 minutes, 12 seconds and 123 milliseconds
10:11:12     '10 hours, 11 minutes and 12 seconds
11:12.123    '11 minutes, 12 seconds and 123 milliseconds
11:12        '11 minutes and 12 seconds
12.123       '12 seconds and 123 milliseconds
12           '12 seconds

我的正则表达式看起来像这样:(?:(?:(\d*):)?(?:(\d*):)?(\d*)(?:\.(\d*))?)

我希望每组对应正确的值。因此,组1应始终返回小时,组2应始终返回分钟,等等……我在Regex101中尝试了这一点,但正如您在这些结果中看到的,当没有小时时,组1总是优于组2。它与时间<code>11:12

如何确保每组始终对应正确的时间段?我可以以某种方式将组2优先于组1吗?

共有1个答案

金阳曜
2023-03-14

您可以将第一个可选组移动到第二个,以便在一个贪婪匹配组中立即连续尝试它们:

(?:(?:(\d+):)?(\d+):)?(\d+)(?:\.(\d+))?
   ^^^^^^^^^^^

查看regex演示

  • (?:(?:(\d ):)?( \d ):)? -一个可选的非捕获组,匹配一个或零个出现:
    • (?:(\d ):)? -可选的非捕获组匹配并捕获到组1中的任何一个或多个数字,然后仅匹配
    • (\d)-组2:一个或多个数字
    • -冒号

 类似资料:
  • 我试图写一个正则表达式来匹配三个组,在三个组中,我希望有一个组是可选的。 正则表达式: 它匹配以下内容: 但是,不是在下面。 如何修改正则表达式,使其匹配两个组。如果第一条消息是三个组。 修复 测试 消息 如果是第二条消息,只有两组 < li >修复 < li >消息 消息

  • 获取给定的URI,如下所示: 如何在斜线之间匹配捕获组中的每个角色?这可以通过以下方法完成: 这给了我三个组,其中: 我遇到的麻烦是让一个捕获组可选。我认为这将工作,认为我可以使每组可选(匹配零或更多): 有没有一种方法,可以使用Regex或PHP选择性地匹配上述URI的、或?

  • 当所有组都是可选的时,我在提取组时遇到了问题。 上下文(如果您愿意,可以跳到结尾):这是在将字符串与一堆正则表达式进行最佳匹配并查看哪个表达式具有最多组匹配的上下文中。 例如,我可能有一个潜在的格式; 但我希望用户打错字,或者不包含空格或其他东西。 所以我可以用绳子测试一下 并希望获得组 一个 光盘 1-1 G 而且,对于测试字符串 我想得到   DE   克 下面是我的正则表达式,用于匹配以下可

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 我们得到了一些这样的内容:

  • 主要内容:基本模式匹配,字符簇,确定重复出现基本模式匹配 一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如: 这个模式包含一个特殊的字符 ^,表示该模式只匹配那些以 once 开头的字符串。例如该模式与字符串 "once upon a time" 匹配,与 "There once was