【问题标题】:Return unique digits of a time format string using regex使用正则表达式返回时间格式字符串的唯一数字
【发布时间】:2019-06-14 19:15:30
【问题描述】:

需要使用 String.match 创建一个正则表达式模式,该模式将在 : 符号之前或之后返回唯一数字。它应该只返回数字,而不是 : 符号。 PS:我知道还有其他(可能更简单)的方法可以做到这一点,但我想使用正则表达式进行学习

let s;
let regex = /(^\d:)(:\d$)/g // I tried this, off course it didn't work

s = '12:34'
s.match(regex) // return null

s = '1:34'
s.match(regex) // return [1]

s = '12:4'
s.match(regex) // return [4]

s = '1:4'
s.match(regex) // return [1,4]

【问题讨论】:

  • /^(\d+):(\d+)$/。没有指向g,你正在匹配整个文本
  • 这只是两个捕获组,中间有:....
  • 我知道它们可能不是真实的例子,但以防万一,您也可以使用.split(':') 获得相同的结果。
  • 看来let regex = /\b\d\b/g 也适合你。符合 ES5,无环顾。
  • @WiktorStribiżew 我相信这会错误地匹配“2 3”,而不是“12:34”

标签: javascript regex match


【解决方案1】:

试试这个:

let regex = /(((?<=:)\d(?!\d))|((?<!\d)\d(?=:)))/g

这将匹配您想要的模式!

这是正则表达式的reference

let s;
let regex = /(((?<=:)\d(?!\d))|((?<!\d)\d(?=:)))/g

s = '12:34'
console.log(s.match(regex)) // return null

s = '1:34'
console.log(s.match(regex)) // return [1]

s = '12:4'
console.log(s.match(regex)) // return [4]

s = '1:4'
console.log(s.match(regex)) // return [1,4]

【讨论】:

  • 这么多人骚扰你的答案,所以我会非常自信地说,EcmaScript5 不支持后面的断言。为什么这是公认的答案?
  • @sln 因为是 2019 年,并且自 ECMAScript 2018 年起就支持lookbehinds。
  • @WiktorStribiżew - 我看不到它们在任何地方都受支持,你能给我一个支持 JS 后向断言的测试站点吗?
  • @sln 打开一个 Chrome 控制台并将"a1b".match(/(?&lt;=a)\d(?=b)/g) 粘贴到那里。
  • 我不使用 Chrome @WiktorStribiżew,我使用 IE11。但是,显示一个支持后向断言的在线 JS 正则表达式测试站点。目前这不是浏览器问题。
【解决方案2】:

在 JavaScript 中完成的示例。第二个正则表达式是最简单的,它匹配一个数字,后跟一个冒号,后跟一个数字(如果您的文本中出现多次,您可以将其与 g 标志一起使用)。

第一个正则表达式匹配整个字符串,并且可以在第一个数字之前有一个或多个字符,在第二个数字之后有一个或多个字符。这只会捕获整个字符串的一次出现。

let regex1 = /^.*(\d):(\d).*$/;
let regex2 = /(\d):(\d)/;

console.log("Make sure the entire string only contains one instance");
['12:34', '1:34', '12:4', '1:4' ].forEach( (s) => console.log(s.match(regex1) ));
console.log("Match the first instance found");
['12:34', '1:34', '12:4', '1:4' ].forEach( (s) => console.log(s.match(regex2) ));

【讨论】:

    【解决方案3】:

    不知道“独特”是什么意思。
    但是,如果您只想获取数字,则可以使用 +* 量词。

    /^(\d+):(\d+)$/

    【讨论】:

    • 谢谢。我的意思是它只有在 : 之后或之前只有一位数字时才匹配(如您在示例中所见)
    • @MichelCurti 您缺少额外的 +。 (即\d+,而不是\d)。将其从“匹配单个数字”(在您的代码中)更改为“匹配一个或多个数字”。这个答案可以更多地解释差异。
    • @Tibrogargan 但我只想匹配一个数字,而不是更多。你能发布一个解释模式应该如何的答案吗?
    • @MichelCurti 您的问题没有解释这一点。请您编辑您的问题并澄清要求吗?谢谢
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2020-02-08
    • 2018-07-23
    相关资源
    最近更新 更多