2016-08-10 2 views
1

Ich versuche einen Komprimierungsalgorithmus zu erstellen, der alle wiederholten Nullen in einer Zeichenfolge von mindestens 5 in Folge mit der Zeichenfolge "z(#)" ersetzt.Regex, um eine wiederholte Ganzzahl durch die Anzahl der Übereinstimmungen zu ersetzen

Zum Beispiel:

"01100000210000000000000001" 

"011z(5)21z(15)1" 

Ich habe in der Lage gewesen, alle Vorkommen von wiederholten Nullen mit einem Teil ersetzen mit dem folgend, aber ich kann nicht herausfinden, wie die Anzahl der Übereinstimmungen zu finden und ersetzen Sie es mit "z(#)"

string.replace(/(0{5,})/g, "hi"); 

Ist dies möglich mit regulären Ausdrücken zu tun?

Antwort

3

Dies ist sehr spezifisch für Ihr Beispiel Regex, aber nur um zu zeigen, dass die replacement value parameter of replace will accept a function.

"01100000210000000000000001".replace(/0{5,}/g, function(matches) { 
    return 'z(' + matches.length + ')'; 
}) 
+1

Die [aktuelle Version von JavaScript] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.8.5) (als dieser Kommentar) ist basiert immer noch auf ECMAScript 5. Diese Frage wurde nicht als eine ECMAScript 6-Frage markiert, und die Fettpfeilsyntax ist nur in ECMAScript 6, glaube ich. Bitte klären Sie entweder die Verwendung des '=>' Operators in Ihrer Antwort oder schreiben Sie ihn neu, damit er in der aktuellen Version von JavaScript ausgeführt werden kann. –

+1

Guter Punkt, danke @JosephMarikle. aktualisiert –

+2

@JosephMarikle Es gibt keine aktuelle Version von JavaScript _version_. ECMAScript 6 ist der _current finished, released standard_, auf dem JavaScript basiert. – Xufox

1
 String expression = "01100000210000000000000001"; 
     Pattern pattern = Pattern.compile("(0{5,})");  
     Matcher matcher = pattern.matcher(expression); 
     while(matcher.find()) { 
      String match =matcher.group(); 
      expression = expression.replaceFirst(match,"Z("+match.length()+")");    
     } 
Verwandte Themen