为什么JavaScript中的正则表达式返回未定义?

为什么JavaScript中的正则表达式返回未定义?,javascript,regex,Javascript,Regex,我正在尝试查找字符串中“test”的所有匹配项: const search=“test”; 常量regexString=“(?:[^]+){0,3}”+“测试”+”(?:[^]+){0,3}”; const re=new RegExp(regexString,“gi”); 常量匹配=[]; const fullText=“我的测试字符串,其中包含大量应与测试正则表达式匹配的测试”; let match=re.exec(全文); while(匹配!=未定义){ matches.push(匹配[1

我正在尝试查找字符串中“test”的所有匹配项:

const search=“test”;
常量regexString=“(?:[^]+){0,3}”+“测试”+”(?:[^]+){0,3}”;
const re=new RegExp(regexString,“gi”);
常量匹配=[];
const fullText=“我的测试字符串,其中包含大量应与测试正则表达式匹配的测试”;
let match=re.exec(全文);
while(匹配!=未定义){
matches.push(匹配[1]);
match=re.exec(全文);
}

console.log(匹配项)您的代码期望匹配结果包括正则表达式中捕获组中捕获的内容。但是,正则表达式只包含非捕获组。
(?:)
分组显式不捕获匹配的子字符串


您需要普通的
()
分组。

您的代码希望匹配结果包括正则表达式中捕获组中捕获的内容。但是,正则表达式只包含非捕获组。
(?:)
分组显式不捕获匹配的子字符串


您需要普通的
()
分组。

您应该将非捕获组
(?:…)
包含在捕获组
(…)
中,因为您正在调用捕获组(
匹配[1]
):


试图返回一个数组,该数组包含和前面的3个单词 正在进行“测试”

然后,您需要推送两个捕获的组,而不是一个:

matches.push([match[1], search, match[2]]);
// `match[1]` refers to first capturing group
// `match[2]` refers to second CG
// `search` contains search word
JS代码:

const search=“test”;
const regexString=“((?:\\S+{0,3})”+search+”((?:\\S+{0,3})”;
const re=new RegExp(regexString,“gi”);
常量匹配=[];
const fullText=“我的测试字符串,其中包含大量应与测试正则表达式匹配的测试”;
while((match=re.exec(全文))!=null){
matches.push([match[1],search,match[2]]);
}

console.log(匹配项)
您应该将非捕获组
(?:…)
包含在捕获组
(…)
中,因为您正在调用捕获组(
匹配[1]
):


试图返回一个数组,该数组包含和前面的3个单词 正在进行“测试”

然后,您需要推送两个捕获的组,而不是一个:

matches.push([match[1], search, match[2]]);
// `match[1]` refers to first capturing group
// `match[2]` refers to second CG
// `search` contains search word
JS代码:

const search=“test”;
const regexString=“((?:\\S+{0,3})”+search+”((?:\\S+{0,3})”;
const re=new RegExp(regexString,“gi”);
常量匹配=[];
const fullText=“我的测试字符串,其中包含大量应与测试正则表达式匹配的测试”;
while((match=re.exec(全文))!=null){
matches.push([match[1],search,match[2]]);
}


console.log(匹配项)预期结果是什么?尝试返回一个包含前面3个单词的数组并继续“测试”只是为了澄清,如果
exec(..)
没有找到匹配项,它将返回
null
而不是
未定义的
。我不是正则表达式专家,但是如果用matches.push替换matches.push(match[1])(匹配[0])您获得:[“我的测试字符串有一个”,“很多测试”,“应该匹配测试正则表达式”]预期的结果是什么?尝试返回一个包含前面3个单词的数组,然后继续“测试”,只是为了澄清,如果
exec(…)
没有找到匹配项,它将返回
null
而不是
未定义的
。我不是正则表达式专家,但如果您用匹配项替换匹配项。push(匹配[1])。push(匹配[0])您将获得:[“我的测试字符串有一个”,“很多测试”,“应该匹配测试正则表达式”]谢谢。当我更改为:const regexString=“([^]+){0,3}“+”test“+”([^]+){0,3}”;我得到:['my','of','the']。有没有办法在'test'搜索前后捕获一些单词?很抱歉,初学者的问题regex让我困惑。@Mary right-您的代码期望在
匹配[1]中有一些内容
,但是如果没有真正的捕获组,
match
将始终是一个只有一个值的数组。您的代码当前只查看
match[1]
,但是正则表达式(固定)捕获两个组,因此您还需要查看
match[2]
。谢谢。当我更改为:const regexString=“([^]+{0,3}+”test+“([^]+){0,3}”我得到:['my','of','the']。有没有办法在'test'搜索前后捕获一些单词?很抱歉,初学者的问题regex让我感到困惑。@Mary right-您的代码期望在
匹配[1]中有一些内容
,但如果没有真正的捕获组,则
匹配将始终是一个只有一个值的数组。您的代码当前只查看
匹配[1]
,但正则表达式(固定)捕获两个组,因此您还需要查看
匹配[2]
。但是,这不会在重叠匹配上输出正确的数据。解决方法是使用前瞻结构。值得一提的是,regex,因此最好的方法是捕获这三个单词(从前后)一起组成一个更大的捕获组。@RodrigoFerreira这不是regex,而是它的味道。也就是说,
.NET
支持访问量化的捕获组,每个捕获组都是单独的。但是,这并不能输出关于重叠匹配的正确数据。解决方法是使用前瞻结构。值得一提的是,regex是最好的方法是在一个更大的捕获组中捕获这三个单词(来自前后)。@RodrigoFerreira这不是正则表达式,而是味道。也就是说,
.NET
支持访问量化的捕获组,每一个单独的捕获组。