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

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


当前回答

只需使用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)}

其他回答

我们可以通过使用反斜杠后跟匹配组的编号来访问正则表达式中的匹配组:

/([a-z])\1/

在由第一组([a-z])匹配的代码\ 1中

单线解决方案:

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

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

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

结果:

[" format_abc"]

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

/\bformat_(.*?)\b/

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

您的语法可能不是最好保留的。FF/Gekko将RegExp定义为Function的扩展。(FF2达到typeof(/patter/)==“函数”)

这似乎是FF特有的——IE、Opera和Chrome都有例外。

相反,使用其他人之前提到的方法:RegExp#exec或String#match。它们提供了相同的结果:

var regex = /(?:^|\s)format_(.*?)(?:\s|$)/;
var input = "something format_abc";

regex(input);        //=> [" format_abc", "abc"]
regex.exec(input);   //=> [" format_abc", "abc"]
input.match(regex);  //=> [" format_abc", "abc"]

var myString=“something format_abc”;var arr=myString.match(/\bformat_(.*?)\b/);控制台日志(arr[0]+“”+arr[1]);

\b并不完全相同。(它适用于--format_foo/,但不适用于format_a_b)但我想展示一个替代表达式,这很好。当然,比赛电话是最重要的。