小调整让这个正则表达式让它做我想要的

时间:2017-01-16 14:47:04

标签: regex coldfusion

我写了一个coldfusion正则表达式来匹配页面的源代码中的时间,它们在页面中分散,如下所示:

<span>10.30</span> stuff <span>10.45-11.15</span> other stuff <span>17.00</span>

我希望比赛是&#34; 10.30&#34; &#34; 10.45-11.15&#34;和&#34; 17.00&#34;。 相反,我得到&#34; 10.30&#34; &#34; 10.45&#34; &#34; 11.15&#34;和&#34; 17.00&#34;。

我试过了:

rematch("(\b[0-2][0-9]\.[0-5][0-9]\b)|(\b[0-2][0-9]\.[0-5][0-9]-[0-2][0-9]\.[0-5][0-9]\b)",mystring)

感谢您纠正错误!当然与小b和连字符有关。

2 个答案:

答案 0 :(得分:3)

您可以在可选的非捕获组(?:...)?的帮助下,使模式的一部分与范围的第二部分匹配,并注意您的正则表达式也匹配最多29小时,也可以得到纠正。

使用

\b(?:2[0-3]|[0-1][0-9])\.[0-5][0-9](?:-(?:2[0-3]|[0-1][0-9])\.[0-5][0-9])?\b

请参阅regex demo

<强>详情:

  • \b - 领先的字边界
  • (?:2[0-3]|[0-1][0-9]) - 2后跟030 / 1的数字,后跟任意数字(=小时) )
  • \. - 一个文字点
  • [0-5][0-9] - 从05的数字后跟任意数字(=分钟)
  • (?:-(?:2[0-3]|[0-1][0-9])\.[0-5][0-9])? - 与-匹配的可选非捕获组,然后是上面描述的相同模式...
  • \b - 一个尾随字边界。

答案 1 :(得分:2)

我认为你不需要'或',只需按照以下方式选择范围:

\b[0-2]\d\.[0-5]\d(-[0-2]\d\.[0-5]\d)?\b

以下是JavaScript等效代码段:

var re = /\b[0-2]\d\.[0-5]\d(-[0-2]\d\.[0-5]\d)?\b/g;
var s = "<span>10.30</span> stuff <span>10.45-11.15</span> other stuff <span>17.00</span>";

console.log(s.match(re));