このような投稿がたくさんあり、いくつかの解決策を見つけましたが、完璧ではありません. それらの中の一つ:
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
結果は次のとおりです。
abhahahahahahaset
結果を取得したい:
abhaset
これを行う方法 ?
このような投稿がたくさんあり、いくつかの解決策を見つけましたが、完璧ではありません. それらの中の一つ:
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
結果は次のとおりです。
abhahahahahahaset
結果を取得したい:
abhaset
これを行う方法 ?
.+貪欲です。できる限りかかります。これは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 エラーです。
.+は可能な最大量に一致するため、 とをhahahaha満たします。可能な限り最小量に一致させたいので、消極的な量指定子を使用します。(.+)\1hahahaha
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+?)\1+/gi, '$1')