我需要创建一个与特定句子结构匹配的正则表达式(在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。我需要表达式才能匹配到###后一天/周。你如何让它在那时停下来?
答案 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
的括号。我不确定为什么你在day
和week
附近不需要它们。如果我有权访问sed
,我知道我希望看到它如何处理((day)|(week))
与(day|week)
的对比。