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

IT技术 javascript regex substring
2021-02-25 05:47:23

我需要在 javascript 中做很多正则表达式的事情,但在语法上有一些问题,我似乎无法找到一个明确的资源......出于某种原因,当我这样做时:

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

表明

"afskfsd33j, fskfsd33"

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

感谢您的任何建议

5个回答

match 返回一个数组。

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

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);
哦,好吧,我想我错过了..谢谢,我有时对 javascript 感到困惑,因为我习惯了在 php 中打印数组的更受限制的方式
2021-04-22 05:47:23
我可能听起来很傻,但为什么 match 返回原始字符串?有没有这方面的文件?
2021-05-16 05:47:23
@john-lee 这是因为原始字符串与正则表达式匹配,/a(.*)j/并且数组的第二个条目包含第一个匹配的 group (.*)此外,group(0) 始终是整个匹配项,而 group(n) 是用括号标记的第 n 个组。如果不尝试此文档以获取更多信息,我希望这是可以理解的
2021-05-17 05:47:23

括号 () 定义的每个组在处理过程中被捕获,每个捕获的组内容按与模式中的组开始的顺序相同的顺序推送到结果数组中。http://www.regular-expressions.info/brackets.htmlhttp://www.regular-expressions.info/refcapture.html上查看更多信息(选择正确的语言以查看支持的功能)

var source = "afskfsd33j"
var result = source.match(/a(.*)j/);

result: ["afskfsd33j", "fskfsd33"]

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

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

数组中的第二个值是由括号定义的捕获组。在您的案例组中包含完整的模式匹配,没有在括号外定义的内容,所以完全是“fskfsd33”。

如果你想摆脱数组中的第二个值,你可以像这样定义模式:

/a(?:.*)j/

其中“?:”表示与括号中的内容匹配的字符组将不是结果数组的一部分。

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

/a.*j/

如果您只想检查源文本是否与模式匹配,而不关心它找到了哪个文本,那么您可以尝试:

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

结果应该只返回 true|false 值。有关更多信息,请参阅http://www.javascriptkit.com/javatutors/re3.shtml

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

我不知道这是不正确的还是措辞不当。数组 ( test[0]) 中的第一个元素不是整个字符串,而是与整个正则表达式匹配的字符串部分。在这种情况下,它们碰巧相同,但如果正则表达式为/f(.*)j/,则结果将是fskfsd33j, skfsd33(首字母a不包含在匹配中)。
2021-04-26 05:47:23

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

  • 改变这一行

    var test = tesst.match(/a(.*)j/);

  • 对此

    var test = tesst.match(/a.*j/);

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

  • 同样根据 developer.mozilla.org 文档:

如果您只想找到第一个匹配项,则可能需要 RegExp.exec()改用。

您可以使用以下代码:

RegExp(/a.*j/).exec("afskfsd33j")

我刚刚遇到了同样的问题。

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

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。