使用正则表达式

时间:2015-06-21 10:39:22

标签: javascript regex

我见过很多这方面的例子,但没有帮助。我有以下字符串:

var str = 'asfasdfasda'

我要提取以下内容

asfa asfasdfa asdfa asdfasda asda 

即所有以' a'开头的子字符串以' a'

结尾

这是我的正则表达式

/a+[a-z]*a+/g

但这总是只给我一场比赛:

[ 'asdfasdfsdfa' ]

有人可以在我的实施中指出错误。

感谢。

修改更正了所需的子字符串数。请注意,还需要重叠和重复的子字符串。

3 个答案:

答案 0 :(得分:5)

要捕获重叠匹配,您需要预先查找正则表达式并抓住捕获的组#1和#2:

/(?=(a.*?a))(?=(a.*a))/gi

RegEx Demo

<强>解释

(?=...)被称为前瞻,它是一个零宽度断言,如锚点或单词边界。它只是向前看,但不会向前移动正则表达式指针,从而使我们能够在组中抓取重叠匹配。

See more on look arounds

<强>代码:

var re = /(?=(a.*?a))(?=(a.*a))/gi;
var str = 'asfasdfasda';
var m; 
var result = {};
while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex)
        re.lastIndex++;
    result[m[1]]=1;
    result[m[2]]=1;
}

console.log(Object.keys(result));
//=> ["asfa", "asfasdfasda", "asdfa", "asdfasda", "asda"]

答案 1 :(得分:1)

解析器不会在磁带上转到先前的状态以再次匹配启动a。

&#13;
&#13;
var str = 'asfaasdfaasda'; // you need to have extra 'a' to mark the start of next string

var substrs = str.match(/a[b-z]*a/g); // notice the regular expression is changed.

alert(substrs)
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你可以这样计算:

var str = "asfasdfasda";
var regex = /a+[a-z]*a+/g, result, indices = [];
while ((result = regex.exec(str))) {
     console.log(result.index); // you can instead count the values here.
}