Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript正则表达式中匹配整个句子?_Javascript_Regex - Fatal编程技术网

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

如何在Javascript正则表达式中匹配整个句子?,javascript,regex,Javascript,Regex,我需要创建一个正则表达式(Javascript)来匹配特定的句子结构。在我的例子中,它是“Course##########”,其中###可以是任何1到3位数字。此外,它可以是“周”而不是“天”,因此“课程#########”也有效 到目前为止,我已经想到: var regTest=/^(Course) \d{1,3} (day)|(week) \d{1,3}$/ 问题是,这个表达式与“课程9第1天”匹配,这正是我想要的,但它也与“课程9第1天计划在07/01/09”匹配 换言之,下面的返回值为

我需要创建一个正则表达式(Javascript)来匹配特定的句子结构。在我的例子中,它是“Course##########”,其中###可以是任何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。我需要表达式只匹配到第二天/星期。如何使其在该点停止?

需要额外的分组级别:

var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/
您需要将OR(管道)移动到日和周之间的括号中:

/^(Course) \d{1,3} (day|week) \d{1,3}$/
如果管道位于管道内,则与该位置的“日”或“周”匹配。如果管道不在parens中,则它与表达式的前半部分(即“课程日”)或后半部分(即“周”)匹配

此外,如果您只是尝试验证字符串是否与模式匹配,则可以使用“测试”而不是“搜索”:

你想要

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

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

除了需要将
(day)|(week)
的检查放在括号块中,即

var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/
实际上,您可以将语句简化为

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

顺便说一句,我知道为什么在
课程
周围不需要括号。我不知道你为什么不需要他们在
。如果我有权访问
sed
,我想看看它是如何处理
((日)|(周))
还是
(日|周)

您是在尝试从字符串中提取某些内容,还是只是在尝试验证字符串是否与模式匹配?
var regTest=/^Course \d{1,3} (day|week) \d{1,3}$/