在动态正则表达式中使用JavaScript替代拥有量词

我使用JavaScript从逗号分隔的成员字符串中提取“兄弟姐妹”的子集,我将其称为“生成”字符串。

隐喻地说,这些成员都来自同一代,但他们并不都是兄弟姐妹(来自同一父母)。 这是一个例子:

// This is the generation string to search
var generation  = 'ABAA,ABAB,ABAC,ABAD,ABBA,ACAA,ACAB,ACAD,AEAB,AEAD,AFAA';

// This is the member for whom to extract siblings (member included)
var member      = 'ACAA';

代字符串及其成员具有以下特征:

  • 每个成员具有与其他成员相同数量的字符
  • 字符串的所有成员都是字母排序的
  • 每一组兄弟姐妹将永远彼此相邻
  • 兄弟姐妹是那些除了最后一封信以外共用完全相同字母组合的成员
  • 继续举例...

    // This is how I go about extracting the desired result: ACAA,ACAB,ACAD
    var mParent     = member.substr(0, member.length - 1) ;
    var mPattern    = mParent + '[A-Z]';
    var mPattern    = '(.*)((' + mPattern + ')(,$1)*)(.*)'; // Trouble is here
    var mRegex      = new RegExp(mPattern);
    var mSiblings   = generation.replace(mRegex, '$2');
    

    上面确定的故障点涉及构造模式中的正则表达式量词。 如上所述,一切都设置为贪婪,所以mSiblings的值是:

    ACAD
    

    这只是最后一个成员。 将mPattern更改为不太贪婪以期提取其他成员会得到以下结果

    // Reluctant first expression yields ACAA
    var mPattern = '(.*?)((' + mPattern + ')(,$1)*)(.*)'; 
    
    // Reluctant last expression yields ACAD,AEAB,AEAD,AFAA
    var mPattern = '(.*)((' + mPattern + ')(,$1)*)(.*?)'; 
    
    // Reluctant first and last yields ACAA,ACAB,ACAD,AEAB,AEAD,AFAA
    var mPattern = '(.*?)((' + mPattern + ')(,$1)*)(.*?)';
    

    如果我能够让中间表达式占有,这将会解决问题。 像这样的东西:

    // Make as many "middle" matches as possible by changing (,$1)* to (,$1)*+
    var mPattern = '(.*?)((' + mPattern + ')(,$1)*+)(.*?)';
    

    但正如我读过的(并且有语法错误来证明它),JavaScript不支持所有格正则表达式量词。 有人可以提出解决方案吗? 谢谢。


    最明显的问题是$1 。 在正则表达式中,您可以参考使用1而不是$1捕获组# $1 。 你的正则表达式中的(,$1)*永远不会匹配任何东西。 但是,小组参考无论如何不会有任何好处。

    当你在正则表达式中使用组引用时,你不再使用正则表达式的那部分,你只是匹配它第一次匹配的相同的东西。 也就是说, (ACA[AZ])(,1)*将与ACAA,ACAA匹配,但不与ACAA,ACABACAA,ACAC匹配。 如果你想这样做,你需要重复实际的正则表达式: (ACA[AZ])(,ACA[AZ])* 。 由于你动态生成正则表达式,这应该不成问题。

    请注意,这是整个正则表达式: ACA[AZ](,ACA[AZ])* 。 没有必要匹配您感兴趣的部分之前或之后的内容; 这只会让工作变得更加复杂(而且结果更令人困惑)。 您可以直接访问匹配结果,而不是使用“替换”噱头:

    var match = mRegex.exec(generation);
    if (match != null) {
        mSiblings = match[0];
    }
    
    链接地址: http://www.djcxy.com/p/76979.html

    上一篇: JavaScript Alternative To Possessive Quantifiers In Dynamic Regex

    下一篇: Regex: possessive quantifier for the star repetition operator, i.e. \d**