2010-02-24 10 views
5

Nie jestem pewien, czy istnieje prosty sposób na zrobienie tego, ale czy istnieje sposób na znalezienie wielu wystąpień w nieznanym ciągu? Na przykład:Algorytm (lub wyrażenie regularne) potrzebny do znalezienia wielu wystąpień czegokolwiek

hellohellohellobyebyebyehello 

nie znając wartości powyżej ciągiem, mogę coś powrócić że powie mi, że są 3 przypadki „cześć” i 3 przypadki „bye” (I nie martwię .! ostatnią cześć jednak jak szukam kolejnych powtórzeń Dzięki z góry

+0

Są one zawsze słownika słowa? – RichardOD

Odpowiedz

2

"testhellohellohellobyebyebyehello".match(/(.+)\1+/)

ten mówi: „dopasować sekwencję co najmniej 1 znak (.+), a następnie odwołać się, że pierwszą rzeczą, którą znaleźliśmy \1 przynajmniej jeden raz + lub więcej

Powróci ["hellohellohello", "hello"] czyli mecze hellohellohello. pełne wyrażenie (wyrażenie 0), a "cześć" pasuje do wyrażenia 1 (to, z czym się odwołujemy: \1).

Zastrzeżenie:
coś podobnego do "hahahaha" przyniesie ["hahahaha", "haha"], zamiast ["hahahaha", "ha"]. więc będziesz musiał użyć powyższego z pewnym przetwarzaniem, aby uzyskać pożądany wynik.

0

jeśli patrząc dla słownika wyrazów można załadować leksykonu w sposób suffix tree , następnie rozważaj znaki twojego napisu jeden po drugim i idź thr niech twoje drzewo. Za każdym razem, gdy osiągasz liść, zwiększasz o jedno skojarzone "słowo".

+0

Drzewo prefiksu jest wystarczające i bardzo łatwe do wdrożenia nawet w javascript. – jkff

+0

Usunąłem to, co powiedziałem o javascript, ponieważ nie jestem ekspertem ... i prawda, drzewo prefiksu jest wystarczające, łatwiejsze do wdrożenia, ale mniej zoptymalizowane – PierrOz

0
var source = "asdhellohellohellobyehellohellohellohelloasdhello"; 
var key = "hello"; 
var len = key.length; 
var res = 0, tempres, next; 
var last = source.indexOf(key); 
while(last != -1) 
{ 
    tempres = 0; 
    next = last; 
    while(true) 
    { 
    tempres++; 
    next += len; 
    last = source.indexOf(key, next); 
    if(last != next) 
     break; 
    } 
    res = (tempres > res) ? tempres : res; 
} 
console.log(res);//4 
4
s = "hellohellohellobyebyebyehello" 
s.replace(/(.+)(\1+)/g, function($0, $1) { 
    console.log($1 + " repeated " + ($0.length/$1.length) + " times"); 
}); 
+2

+1 za innowacyjność. Zrób pierwsze '+' nongreedy ('/ (. +?) (\ 1 +) /') lub dopasuje 'hellohello' powtórzone 2 razy zamiast' hello' powtórzone 4 razy (jeśli są 4 (lub więcej)) witaj w sznurku) – Amarghosh

Powiązane problemy