如何在Javascript正则表达式中匹配整个句子?

时间:2009-07-27 03:11:40

标签: javascript regex

我需要创建一个与特定句子结构匹配的正则表达式(在Javascript中)。在我的例子中,它是“Course ### day ###”,其中###可以是任何1到3位数字。此外,它可以是“周”而不是“日”,因此“课程###周###”也是有效的。

到目前为止,我已经提出:

var regTest=/^(Course) \d{1,3} (day)|(week) \d{1,3}$/

问题是这个表达式匹配“课程9第1天”,这是我想要的,但它也会匹配“课程9第1天预定于07/01/09”。

换句话说,以下内容返回值0:

"Course 9 day 1".search(regTest)

但是这个也会返回0:

"Course 9 day 1 scheduled on 07/01/09".search(regTest)

我希望第一个测试返回0,但我希望第二个测试返回-1。我需要表达式才能匹配到###后一天/周。你如何让它在那时停下来?

4 个答案:

答案 0 :(得分:3)

您需要将OR(管道)移动到日期和星期之间的括号中:

/^(Course) \d{1,3} (day|week) \d{1,3}$/

如果管道位于parens内部,那么它在该位置匹配“day”或“week”。如果管道不在parens里面,它会匹配表达式的前半部分(即“Course ### day”)或表达式的后半部分(即“week ###”)。

此外,如果您只是想验证字符串是否与模式匹配,则可以使用“test”而不是“search”:

if(/^(Course) \d{1,3} (day|week) \d{1,3}$/.test(someString)) {
    // it matches!
}

答案 1 :(得分:0)

需要额外的分组级别:

var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/

答案 2 :(得分:0)

你想要

var regTest=/^(Course) \d{1,3} (day|week) \d{1,3}$/

(请注意(day)|(week)已更改为(day|week))。你的旧正则表达式实际上是两个,加入了|。你看,|是一个较少(最少?)紧密绑定的正则表达式元字符,这意味着ab|cd将匹配“ab”和“cd”,但不匹配“abd”或“acd”。

答案 3 :(得分:0)

除了您需要将(day)|(week)的支票放在括号内,即

之外,您拥有一切正确的权利。
var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/

您实际上可以将语句缩减为

var regTest=/^Course \d{1,3} (day|week) \d{1,3}$/

顺便说一句,我知道为什么你不需要围绕Course的括号。我不确定为什么你在dayweek附近不需要它们。如果我有权访问sed,我知道我希望看到它如何处理((day)|(week))(day|week)的对比。