我需要在javascript中做很多正则表达式的事情,但是我在语法上遇到了一些问题,而且我似乎无法在此找到一个明确的资源......出于某些原因,当我这样做时:
var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test)
显示
"afskfsd33j, fskfsd33"
我不确定为什么它会给出原始和匹配字符串的输出,我想知道我怎么能得到它才能给出匹配(基本上从原始字符串中提取我想要的部分)
感谢您的任何建议
答案 0 :(得分:85)
match
返回一个数组。
JavaScript中数组的默认字符串表示形式是以逗号分隔的数组元素。在这种情况下,所需的结果是在数组的第二个元素中:
var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);
答案 1 :(得分:5)
我认为你的问题是match方法返回一个数组。数组中的第0项是原始字符串,第1项到第n项对应于第1到第n个匹配的括号项。你的“alert()”调用显示整个数组。
答案 2 :(得分:4)
在处理期间捕获由括号()定义的每个组,并且每个捕获的组内容按照与模式开始中的组相同的顺序被推入结果数组。有关http://www.regular-expressions.info/brackets.html和http://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
答案 3 :(得分:3)
我刚遇到同样的问题。
如果包含匹配组(括号中)和“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。
答案 4 :(得分:2)
只需除去括号,这将为您提供一个包含一个元素的数组,并且:
var test = tesst.match(/ a(。*)j /);
var test = tesst.match(/a.*j /);
如果添加括号,match()函数将为您找到两个匹配项,一个匹配整个表达式,一个匹配括号内的表达式
如果您只想找到第一个匹配项,则可能要使用 而是RegExp.exec()。
您可以使用以下代码:
RegExp(/a.*j /)。exec(“ afskfsd33j”)