2

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 は所有格の正規表現量指定子をサポートしていません。誰かが解決策を提案できますか? ありがとうございました。

4

1 に答える 1