Javascript 正则表达式提取子字符串,出于某种原因返回2个结果

Javascript 正则表达式提取子字符串,出于某种原因返回2个结果,javascript,regex,substring,Javascript,Regex,Substring,我需要用javascript做很多正则表达式的事情,但是我在语法方面遇到了一些问题,我似乎找不到关于这个的权威资源。。出于某种原因,当我这样做时: var tesst = "afskfsd33j" var test = tesst.match(/a(.*)j/); alert (test) 它表明 "afskfsd33j, fskfsd33" 我不知道为什么它会给出原始字符串和匹配字符串的输出,我想知道如何让它只给出匹配(基本上是从原始字符串中提取我想要的部分) 感谢您的建议匹配返回一个数组

我需要用javascript做很多正则表达式的事情,但是我在语法方面遇到了一些问题,我似乎找不到关于这个的权威资源。。出于某种原因,当我这样做时:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test)
它表明

"afskfsd33j, fskfsd33"
我不知道为什么它会给出原始字符串和匹配字符串的输出,我想知道如何让它只给出匹配(基本上是从原始字符串中提取我想要的部分)


感谢您的建议

匹配
返回一个数组

JavaScript中数组的默认字符串表示形式是由逗号分隔的数组元素。在这种情况下,所需结果位于数组的第二个元素中:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);

我认为您的问题是match方法返回了一个数组。数组中的第0项是原始字符串,第1到第n项对应于第1到第n个匹配的括号项。您的“alert()”调用正在显示整个阵列。

我刚才遇到了同样的问题

如果包含匹配组(括号中)和“g”(全局)修饰符,则只会在结果中获得两次文本。 第一项始终是第一个结果,在短字符串上使用match(reg)时通常是OK,但在使用以下结构时:

while ((result = reg.exec(string)) !== null){
    console.log(result);
}
结果有点不同

请尝试以下代码:

var regEx = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
var result = sample_string.match(regEx);
console.log(JSON.stringify(result));
// ["1 cat","2 fish"]

var reg = new RegExp('[0-9]+ (cat|fish)','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null) {
    console.dir(JSON.stringify(result))
};
// '["1 cat","cat"]'
// '["2 fish","fish"]'

var reg = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null){
    console.dir(JSON.stringify(result))
};
// '["1 cat","1 cat","cat"]'
// '["2 fish","2 fish","fish"]'
(在最新的V8-Chrome、Node.js上测试)


目前最好的答案是一条我无法投票的评论,所以请归功于@Mic。

在处理过程中捕获括号()定义的每个组,并将每个捕获的组内容按与模式开始中的组相同的顺序推送到结果数组中。请参阅和的详细信息(选择正确的语言以查看支持的功能)

您收到此确切结果的原因如下:

数组中的第一个值是第一个找到的字符串,用于确认整个模式。因此,它肯定应该以“a”开头,后跟任意数量的字符,并以“a”开头后的第一个“j”字符结尾

数组中的第二个值由括号定义的组捕获。在您的案例组中,包含完整的模式匹配,而不在括号外定义内容,因此确切地说是“fskfsd33”

若要去掉数组中的第二个值,可以定义如下模式:

/a(?:.*)j/
其中“?:”表示与括号中的内容匹配的字符组将不属于结果数组的一部分

在这种简单的情况下,其他选项可能是在没有任何组的情况下编写模式,因为根本不需要使用组:

/a.*j/
如果只想检查源文本是否与模式匹配,而不关心找到的文本,可以尝试:

var result = /a.*j/.test(source);

结果应该只返回true | false值。有关更多信息,请参见

只需去掉括号,它将为您提供一个包含一个元素的数组,并且:

  • 换行
var test=tesst.match(/a(.*)j/)

  • 对此
var test=tesst.match(/a.*j/)

如果添加括号,match()函数将为您找到两个匹配项,一个用于整个表达式,另一个用于括号内的表达式

  • 根据developer.mozilla.org文档:
如果只希望找到第一个匹配项,则可能需要使用 改为RegExp.exec()

您可以使用以下代码:


RegExp(/a.*j/).exec(“afskfsd33j”)

ohh好的,我想我错过了。。谢谢,我有时会对javascript感到困惑,因为我习惯了在phpI中打印数组的更受限制的方式,这听起来可能很愚蠢,但是为什么match会返回原始字符串呢?有关于此的文档吗?@john lee这是因为原始字符串与regex
/a(.*)j/
匹配,数组的第二个条目包含第一个匹配组
(.*)
。此外,组(0)始终是整个匹配,而组(n)是用括号标记的第n组。我希望这是可以理解的,如果你不尝试注意,你没有原始和匹配的字符串,因为你的国家。您有匹配的字符串“afskfsd33j”。然后,第二项“fskfsd33”来自regexp中的括号:(*)我不知道这是不正确的还是措词不当。数组中的第一个元素(
test[0]
)不是整个字符串,而是字符串中与整个正则表达式匹配的部分。在这种情况下,它们碰巧是相同的,但如果正则表达式是
/f(.*)j/
,则结果将是
fskfsd33j,skfsd33
(匹配中不包括初始的
a
)。
var result = /a.*j/.test(source);