Javascript匹配不';行不通

Javascript匹配不';行不通,javascript,regex,Javascript,Regex,我有一个字符串,正在尝试使用正则表达式提取一个子字符串。以下是一个例子: var mainString = "SNOW ", stringToMatch = 'snow', regExp = new RegExp(stringToMatch + '[,\\s][^a-zA-Z]','ig'); var match = mainString.match(regExp); console.log(匹配)给我一个null 我在regexr.com编辑器中尝试了相同的正则表达式,它在那里

我有一个字符串,正在尝试使用正则表达式提取一个子字符串。以下是一个例子:

var mainString = "SNOW ",  
stringToMatch = 'snow',  
regExp = new RegExp(stringToMatch + '[,\\s][^a-zA-Z]','ig');  
var match = mainString.match(regExp); 
console.log(匹配)
给我一个
null


我在regexr.com编辑器中尝试了相同的正则表达式,它在那里匹配。我看不出我错在哪里。有人能帮我找到问题吗?

您得到了正确的结果。雪之所以不在,是因为没有什么空间后才这样

[^a-zA-Z]

不匹配任何内容

问题在于正则表达式构造中:

regExp = new RegExp(stringToMatch + '[,\\s][^a-zA-Z]','ig');
[^a-zA-Z]
匹配不在集合中的任何字符
[a-zA-Z]
*它不匹配字符串的结尾,该字符串不是字符,将由
$
指示。因此,您的正则表达式将匹配
“sNoW”
“sNoW 1”
“sNoW”
(例如),但不匹配
“sNoW”
“sNoW”

您可能想要:

// match a non-alphabetic character or the end of the string
regExp = new RegExp(stringToMatch + '[,\\s](?:[^a-z]|$)','ig');

// or

// simply match the word and then stop at a word boundary, \b
regExp = new RegExp(stringToMatch + '\\b','ig');

*请注意,
[a-zA-Z]
i
标志是冗余的;只需使用
[a-z]

我已经编辑了我的输入。请您现在检查并让我知道我的错误所在。问题是相同的,空格后没有匹配项,因此[^a-zA-Z]没有匹配项。如果您的输入是“雪-”它将匹配此工作,谢谢Ed!我不明白“它与字符串的结尾不匹配,这不是一个字符,将由$”表示的部分。如果你不介意,请解释一下好吗?@Ritu很乐意帮忙!我的意思是,
[^a-zA-Z]
只匹配实际字符,例如
2
。它与字符串本身的结尾不匹配。换句话说,想象一下这个正则表达式
/.^a-z]/gi
和这个文本
a@b@c
。在这种情况下,
a@
b@
将匹配
c
不匹配,因为
c
之后没有匹配
[^a-z]
的内容。要允许字符串结尾匹配,可以使用
$
,如下所示:
/([^a-z]|$)/gi
。然后,任何后跟(1)非字母字符或(2)字符串结尾的字符都匹配。所以,
a@
b@
c
将是您的匹配项。明白了!感谢您的详细解释:)