このような投稿がたくさんあり、いくつかの解決策を見つけましたが、完璧ではありません. それらの中の一つ:
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
結果は次のとおりです。
abhahahahahahaset
結果を取得したい:
abhaset
これを行う方法 ?
このような投稿がたくさんあり、いくつかの解決策を見つけましたが、完璧ではありません. それらの中の一つ:
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+)\1+/gi, '$1')
結果は次のとおりです。
abhahahahahahaset
結果を取得したい:
abhaset
これを行う方法 ?
.+
貪欲です。できる限りかかります。これはha
s の半分なので、後半と\1
一致します。繰り返しを貪欲にしないようにすると、うまくいくはずです。
/[^\w\s]|(.+?)\1+/gi
ちなみに、i
ここは何も変わりません。
ネストされた繰り返しを取り除くには (たとえば、 (またはを介して)aaBBaaBB
に変換)、結果が変化しなくなるまで置換を複数回実行するだけです。aB
aaBB
aBaB
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
満たします。可能な限り最小量に一致させたいので、消極的な量指定子を使用します。(.+)\1
haha
haha
"aabbhahahahahahahahahahahasetsetset".replace(/[^\w\s]|(.+?)\1+/gi, '$1')