正则expression式来提取子string,由于某种原因返回2个结果

我需要在JavaScript中做很多正则expression式的事情,但我有一些与语法问题,我似乎无法find一个明确的资源在这..由于某种原因,当我这样做:

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

表明

 "afskfsd33j, fskfsd33" 

我不知道为什么它给这个输出的原始和匹配的string,我想知道如何才能让它只是给匹配(实质上提取我想要从原始string的部分)

感谢您的任何build议

match返回一个数组。

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

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

我认为你的问题是匹配方法返回一个数组。 数组中的第0项是原始string,第1到第n项对应于第1到第n个匹配的括号内项目。 你的“alert()”调用显示整个数组。

我刚刚有同样的问题。

如果包含匹配组(括号中)和“g”(全局)修饰符,则只会在结果中得到两次文本。 第一个项目总是第一个结果,对短string使用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上testing过)

最好的答案是目前的评论,我不能upvote,所以信用@Mic。

在处理过程中捕获由括号()定义的每个组,并将每个捕获的组内容按照与模式开始内的组相同的顺序推入结果数组。 有关http://www.regular-expressions.info/brackets.html和http://www.regular-expressions.info/refcapture.html,请参阅更多内容(select正确的语言以查看支持的function);

 var source = "afskfsd33j" var result = source.match(/a(.*)j/); result: ["afskfsd33j", "fskfsd33"] 

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

数组中的第一个值是确认整个模式的第一个find的string。 所以它肯定应该以“a”开始,后面跟着任意数量的任何字符,并且在开始“a”之后以“j”字符结束。

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

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

 /a(?:.*)j/ 

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

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

 /a.*j/ 

如果您只想检查源文本是否与模式匹配,并且不关心发现哪些文本,则可以尝试:

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

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

试试这个,只返回第一个restult

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