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

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”)有一个特殊值,所以它试图查找下一个参数的值。


当前回答

/*Regex function for extracting object from "window.location.search" string.
 */

var search = "?a=3&b=4&c=7"; // Example search string

var getSearchObj = function (searchString) {

    var match, key, value, obj = {};
    var pattern = /(\w+)=(\w+)/g;
    var search = searchString.substr(1); // Remove '?'

    while (match = pattern.exec(search)) {
        obj[match[0].split('=')[0]] = match[0].split('=')[1];
    }

    return obj;

};

console.log(getSearchObj(search));

其他回答

使用es2018,您现在可以对命名组使用String.match(),使正则表达式更明确地说明它要做什么。

const url =
  'https://stackoverflow.com/questions/432493/how-do-you-access-the-matched-groups-in-a-javascript-regular-expression?some=parameter';
const regex = /(?<protocol>https?):\/\/(?<hostname>[\w-\.]*)\/(?<pathname>[\w-\./]+)\??(?<querystring>.*?)?$/;
const { groups: segments } = url.match(regex);
console.log(segments);

你会得到类似的东西

{protocol:“https”,主机名:“stackerflow.com”,路径名:“questions/432493/how-do-you-acess-the-matched-groups-in-a-javascript-regular-expression”,querystring:“some=parameter”}

获取所有组事件

设m=[],s=“something format_abc format_def format_ghi”;s.replace(/(?:^|\s)format_(.*?)(?:\s|$)/g,(x,y)=>m.push(y));控制台日志(m);

您实际上不需要一个显式循环来解析多个匹配项-传递一个替换函数作为第二个参数,如String.protype.replace(regex,func)中所述:

var str=“我们的主要武器是{1}、{0}和{2}!”;var params=[“惊讶”、“恐惧”、“无情的效率”];var模式=/{([^}]+)}/g;str=str.replace(patt,函数(m0,m1,位置){return params[parseInt(m1)];});document.write(str);

m0参数表示完全匹配的子字符串{0}、{1}等。m1表示第一个匹配组,即正则表达式中括号内的部分,第一个匹配为0。位置是字符串中找到匹配组的起始索引,在本例中未使用。

只需使用RegExp$第1…$n组如:

1.匹配第一组RegExp$1.

匹配第二组RegExp$2.

如果在正则表达式中使用3组(请注意在string.match(正则表达式)之后使用)

注册Exp$1 RegExp$2 RegExp$3.

var str=“${印度}的雨很安全”;var res=str.match(/\${(.*?)\}/ig);//我在上面的例子中只使用了一个组,所以RegExp$1.console.log(RegExp.$1)

//最简单的方法是使用RegExp$1正则表达式中的第一组和第二组//注册Exp$如果存在,则在匹配后使用2var正则表达式=/\${(.*?)\}/ig;var str=“${SPAIN}的雨水主要停留在平原”;var res=str.match(正则表达式);for(res的常量匹配){var res=match.match(正则表达式);console.log(匹配);console.log(RegExp.$1)}

我以为你只想抓取包含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