2

このような投稿がたくさんあり、いくつかの解決策を見つけましたが、完璧ではありません. それらの中の一つ:

"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')

結果は次のとおりです。

abhahahahahahaset

結果を取得したい:

abhaset

これを行う方法 ?

4

2 に答える 2

4

.+貪欲です。できる限りかかります。これはhas の半分なので、後半と\1一致します。繰り返しを貪欲にしないようにすると、うまくいくはずです。

/[^\w\s]|(.+?)\1+/gi

ちなみに、iここは何も変わりません。

ネストされた繰り返しを取り除くには (たとえば、 (またはを介し​​て)aaBBaaBBに変換)、結果が変化しなくなるまで置換を複数回実行するだけです。aBaaBBaBaB

var pattern = /[^\w\s]|(.+?)\1+/g;

var output = "aaBBaaBB";
var input;

do
{
    input = output;
    output = input.replace(pattern, "$1");
} while (input != output)

の命名がoutput最初の繰り返しで少しぎこちないことは認めますが、コンピューター サイエンスで最も困難な 2 つの問題は、キャッシュの無効化、名前付け、off-by-one エラーです。

于 2013-04-25T13:07:40.627 に答える
2

.+は可能な最大量に一致するため、 とをhahahaha満たします。可能な限り最小量に一致させたいので、消極的な量指定子を使用します。(.+)\1hahahaha

"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+?)\1+/gi, '$1')

http://jsfiddle.net/HQRDg/

于 2013-04-25T13:09:13.147 に答える