【问题标题】:Regular expression splitting a optional group正则表达式拆分可选组
【发布时间】:2018-08-18 22:25:46
【问题描述】:

我试图在 JavaScript 中设置一个正则表达式,它可以接受像 12:13:14.15 这样的字符串(最多),但是当只做 12:13 时,它会将第一个匹配 (12) 分成两个匹配。

我已经有一段时间了,我不知道是什么原因造成的。

这是我正在使用的表达式:

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

根据我的尝试,它应该是这样设置的:

  • (XX:)XX:XX(.XX) ,其中 () 是可选的。

正如我上面提到的,将整个内容填满是可行的,并且所有内容都会进入各自的匹配项。但是省略第一个可选部分会导致它将第一个匹配项分成两个匹配项。


例如:

完整的字符串是54:13.15。它将54 拆分为与5 的一场匹配和与4 的一场匹配。我想要它做的是将541315 分成组。它应该被每个:. 分割。

请注意,此示例没有可选部分。包含可选部分,它将正确拆分。

我还需要使用正则表达式,因为我需要限制它可以进行的拆分数量。我不希望它能够有多个 . 拆分或像 10 个 : 拆分。

对此的任何帮助表示赞赏!

【问题讨论】:

  • 您能否编辑问题并添加一个示例,说明您从什么开始以及最终想要什么?这个真的不太清楚:The full string is 54:13.15. It will split '12' into one match with '5' and one match with '4'. '12' 是从哪里来的?你只是想在: 上分裂吗?
  • @MarkMeyer 对不起,我错过了!我最初打算写 12 但将其更改为 54 以使其更清晰但忘记更改 12 那里。我还扩展了这个例子。
  • @UnbearableLightness 这确实成功了。它只是移动其中一根火柴,但我可以使用它。
  • Is this better ?让我知道,仍然有点不清楚你在追求什么。

标签: javascript regex


【解决方案1】:

我认为你让这变得比它需要的更复杂。您可以匹配要拆分的分隔符。您不需要捕获其余部分。例如:

let st = '54:13.15'
// split on : and .
console.log(st.split(/[:.]/))

st = '12:13:14.15'
console.log(st.split(/[:.]/))

st = '12:13:14'
console.log(st.split(/[:.]/))

【讨论】:

  • 虽然这可行,但我让它变得更复杂,因为我需要知道哪个是哪个。当我写这篇文章时,我可能会通过检查字符串是否包含“。”来做同样的事情。这可能意味着数组中的最后一个元素是毫秒。但是一个正则表达式也让我有能力不允许太多的分裂并且匹配保持在原地。
  • @Hertzole 这些约束将是问题的极好细节。
  • 是的,我很抱歉没有包括它。询问时要包含很多细节!
【解决方案2】:

可以使用正则表达式:

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

var timestamp = '12:13:14.15'
var re = /^(\d+)?:?(\d+)?:(\d+)\.?(\d+)?$/g

matches = re.exec(timestamp)
ms = matches[4]
console.log(ms)

var timestamp = '54:13.20'
var re = /^(\d+)?:?(\d+)?:(\d+)\.?(\d+)?$/g

matches = re.exec(timestamp)
ms = matches[4]
console.log(ms)

【讨论】:

  • 不客气,棘手的部分是弄清楚真正的问题是什么:P
  • 我已经注意到了,我会尽力改进,直到下一次!
  • 一切都好,这是正确的心态。我编辑了你的问题,使其更具可读性。
猜你喜欢
  • 2010-11-04
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2013-08-11
相关资源
最近更新 更多