我正在使用 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';
生成字符串及其成员具有以下特征:
- 每个成员的字符数与其他成员相同
- 字符串的所有成员都是 alpha 排序的
- 每组兄弟姐妹总是彼此相邻
- 兄弟姐妹是那些除了最后一个字母外共享完全相同的字母组合的成员
继续这个例子……
// 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 不支持所有格正则表达式量词。有人可以提出解决方案吗?谢谢你。