如何在不增加子表达式计数的情况下匹配子表达式中的n +实例?

时间:2011-08-02 22:32:46

标签: javascript regex

(我知道我的问题令人困惑,所以请参阅下面的示例/解释)

我试图在一个大的正则表达式中匹配一堆东西然后找出我匹配的子表达式。问题是当我的一个子表达式中有一个“集合/序列”时,会抛出子表达式的索引。

例如,在下面的表达式中,检查“foo”将位于索引3:

/(one)|(two)|(foo)/g

但是在这一个中,它在索引4处(是的,这是一个愚蠢的正则表达式,但这个例子适合):

/(one)|(([tT][wW])?o)|(foo)/g

如果你使用下面的代码尝试找到“foo”,你会得到类似的东西:

var str = "Some string that only matches foo";

while ( match = reg.exec( str ) )
{
    for ( var i = 1; i < match.length; i++ )
    {
        //Should be 3 but it's not
        if( match[ i ] !== undefined ) break;
    }

    //This won't match foo, because it's now the wrong index
    alert( match[ i ] );
}

如何在子表达式括号内执行“一个或多个”类型表达式,而不影响通过“regex.exec”返回“匹配”的索引?

(注意:请不要犹豫,告诉我这是否有任何不清楚的地方,我会尝试提出一个更好的例子和完整的示例代码)

2 个答案:

答案 0 :(得分:4)

(pattern)匹配并捕获匹配项。如果您想匹配但不捕获,请使用(?:pattern)

答案 1 :(得分:1)

因为foo组是表达式中第四个捕获的组,因此foo将始终位于索引4处。您可以使用?:表示某个群组不应捕获:

/(one)|((?:[tT][wW])?o)|(foo)/g

现在foo将回到索引3。