我正在使用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不支持所有格正則表達式量詞。有人可以提出解決方案嗎?謝謝。
如果每個構件的長度不是固定的,則字邊界是必要的。如果它是固定的,那麼當前的解決方案是有效的。 – nhahtdh
@nhahtdh:你說的是真的,但是OP確實說過所有成員的長度都是一樣的,除了最後一個字母之外,其他同胞都是一樣的。雖然代碼片段和聲明的輸出很混亂,但實際的*問題*(大約前三分之一)在這些點上是清楚的。 –