5

「ゲーデル、エッシャー、バッハ」第 2 章の MIU システムの問題に取り組んでいます。

ルールの状態の 1 つ

Rule III: If III occurs in one of the strings in your collection, you may make a new string with U in place of III.

これは、文字列MIIIが になる可能性があることを意味しますMUが、他の長い文字列の場合、複数の可能性があります [括弧内の一致]:

  • MIIII譲ることができた
    • M[III]I>>MUI
    • MI[III]>>MIU
  • MUIIIUIIIU譲ることができた
    • MU[III]UIIIU>>MUUUIIIU
    • MUIIIU[III]U>>MUIIIUUU
  • MUIIIIU譲ることができた
    • MU[III]IU>>MUUIU
    • MUI[III]U>>MUIUU

などの正規表現は明らか/(.*)III(.*)/に役に立ちますが、可能性のあるすべての一致を生成するようにそれらを取得することはできないようです。たまたま最初に見つかったものだけです。

可能なすべての一致を生成する方法はありますか?

(注、これを完全に手動で行う方法を考えることができますが、組み込みツール、正規表現などを使用するより良い方法があることを願っています)

(重複するニーズを明確にするために編集されました。)

4

2 に答える 2

2

時々正規表現はやり過ぎです。あなたの場合、シンプルindexOfでもいいかもしれません!

これは確かにハックですが、自分できれいで再利用可能なコードに変換できます。

var s = "MIIIIIUIUIIIUUIIUIIIIIU";
var results = [];
for (var i = 0; true; i += 1) {
    i = s.indexOf("III", i);
    if (i === -1) {
        break;
    }
    results.push(i);
}
console.log("Match positions: " + JSON.stringify(results));

オーバーラップを問題なく処理し、少なくとも私にindexOfは単純に見えます。

于 2013-08-03T05:34:48.480 に答える