Regex to extract substring, returning 2 results for some reason

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

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

看得出来

"afskfsd33j, fskfsd33"

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

谢谢你的建议

226030 次浏览

match returns an array.

数组在 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);
}

结果有点不同。

Try the following code:

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。

在处理过程中捕获由括号()定义的每个组,并将捕获的每个组内容按照与模式开始中的组相同的顺序推送到结果数组中。查看更多关于 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/

where "?:" means that group of chars which match the content in parenthesis will not be part of resulting array.

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

/a.*j/

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

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

结果应该只返回 true | false 值。更多信息见 http://www.javascriptkit.com/javatutors/re3.shtml

只要去掉括号就会得到一个只有一个元素的数组:

  • 换这条线

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

  • 敬这个

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

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

  • 根据 developer.mozilla.org 文件:

If you only want the first match found, you might want to use 取而代之的是 RegExp.exec()

你可以使用以下代码:

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