我想使用正则表达式匹配字符串的一部分,然后访问带括号的子字符串:

var myString=“something format_abc”;//我要“abc”var arr=/(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString);控制台日志(arr);//打印:[“format_abc”,“abc”]。。到现在为止,一直都还不错。控制台日志(arr[1]);//打印:未定义(???)控制台日志(arr[0]);//打印:format_undefined(!!!)

我做错了什么?


我发现上面的正则表达式代码没有任何问题:我测试的实际字符串是这样的:

"date format_%A"

报告“%A”未定义似乎是一种非常奇怪的行为,但它与这个问题没有直接关系,所以我打开了一个新的问题,为什么匹配的子字符串在JavaScript中返回“undefined”?。


问题是console.log像printf语句一样接受其参数,因为我记录的字符串(“%a”)有一个特殊值,所以它试图查找下一个参数的值。


当前回答

关于上面的多匹配括号示例,我在没有得到我想要的答案后,在这里寻找答案:

var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);

在查看了上面while和.push()的稍微复杂的函数调用之后,我发现这个问题可以用mystring.replace()非常优雅地解决(替换不是重点,甚至还没有完成,第二个参数的CLEAN内置递归函数调用选项是!):

var yourstring = 'something format_abc something format_def something format_ghi';

var matches = [];
yourstring.replace(/format_([^\s]+)/igm, function(m, p1){ matches.push(p1); } );

在这之后,我想我再也不会用.match()做任何事情了。

其他回答

如果你和我一样,希望正则表达式返回这样的Object:

{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
}

然后从下面剪切函数

/***@param{string | number}输入*要匹配的输入字符串*@param{regex | string}表达式*正则表达式*@param{string}标志*可选标志* *@return{array}* [{匹配:“…”,matchAtIndex:0,捕获的组:[“…”,“…”]}] */函数regexMatch(输入,表达式,标志=“g”){让regex=RegExp的表达式实例?表达式:新RegExp(表达式,标志)let matches=input.matchAll(正则表达式)匹配=[…匹配]return matches.map(项=>{返回{匹配:项[0],matchAtIndex:项索引,捕获组:item.length>1?item.s切片(1):未定义}})}let input=“key1:value1,key2:value2”让正则表达式=/(\w+):(\w+)/glet matches=regexMatch(输入,regex)console.log(匹配项)

我以为你只想抓取包含abc子字符串的所有单词并存储匹配的组/条目,所以我编写了这个脚本:

s='some format_abc另一个单词abc abc_somestring'console.log(s.match(/\b\w*abc\w*\b/igm));

\b-单词边界\w*-0+个字符abc-您的完全匹配\w*-0+个字符\b-单词边界

参考:Regex:匹配包含某个单词的所有单词https://javascript.info/regexp-introduction

即使我同意PhiLo的正则表达式应该是:

/\bformat_(.*?)\b/

(当然,我不确定,因为我不知道正则表达式的上下文。)

正如@cms在ECMAScript(ECMA-262)中所说,您可以使用matchAll。它返回一个迭代器,并通过将其放入[…](扩展运算符)中转换为数组。(此正则表达式提取文件名的URL)

let text=`<a href=“http://myhost.com/myfile_01.mp4“>文件1</a><a href=”http://myhost.com/myfile_02.mp4“>文件2</a>`;let fileUrls=[…text.matchAll(/href=“(http://\/[^”]+\.\w{3})\”/g)].map(r=>r[1]);console.log(fileUrls);

单线解决方案:

const matches = (text,regex) => [...text.matchAll(regex)].map(([match])=>match)

因此您可以使用这种方式(必须使用/g):

matches("something format_abc", /(?:^|\s)format_(.*?)(?:\s|$)/g)

结果:

[" format_abc"]