在动态正则表达式中使用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,ACAB
或ACAA,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**