2016-07-29 15 views
-1

Ich führe einen Fund und ersetzen durch Schluck.Regex finden und ersetzen Sie mit Schluck/Knoten und verwenden Sie einen Teil des Finds String in der Ersetzung?

Ich brauche diese Zeichenfolge unten zu finden (ANYTHING kann alles sein, es ist nicht eine Reihe von 'ANYTHING'):

{% id_ANYTHING %} 

Und es mit diesem ersetzen:

{% block ANYTHING %}{% endblock %} 

Example1.

diese ersetzen:

{% id_page %} 

mit diesem:

{% block page %}{% endblock %} 

Example2.

ersetzen diese:

{% id_whatever %} 

mit diesem:

{% block whatever %}{% endblock %} 

Ive fand die Regex, die ich brauche, das Spiel zu finden. Ich benutze bereits gulp-replace für eine ähnliche, aber einfachere Aufgabe, also habe ich angefangen, es dafür zu benutzen, aber ich bin mir nicht sicher, wie man den "irgendwas" -Wert ergreift, damit ich ihn beim Ersetzen verwenden kann.

https://github.com/lazd/gulp-replace

replace = function() { 
    return gulp.src('before.html') 
    .pipe(replace({ 
     patterns: 
     [{ 
      match: /{% id_.{2,99} %}/g, 
      replacement: '{% block page %}{% endblock %}' 
     }] 
    })) 
    .pipe(gulp.dest('after.html')); 
}, 

Sollte ich dies mit Gulp oder Knoten zu suchen, zu tun?

Antwort

0

Pro die Dokumentation für gulp-replace Sie eine Funktion für den Ersatzwert verwenden können, wie können Sie für String.prototype.replace()

Auch ich Ihre RegEx zu einer Gruppe geändert haben die .{2,99} zusammen () verwenden. Die Callback-Funktion String.replace() wird jede Gruppe als separates arg ausbrechen. Da Sie nur daran interessiert sind, diese Gruppe zu extrahieren, können wir String.replace() die gesamte Arbeit ausführen und den Wert zurückgeben, um den übereinstimmenden Text zu ersetzen.

const gulp = require('gulp') 
const replace = require('gulp-replace'); 
const path = require('path'); 
let pattern = new RegExp(/{% id_(.{2,99}) %}/, 'g'); 

gulp.task('replace',() => { 
    return gulp.src('before.html') 
    .pipe(replace(pattern, (match, p1) => { 
     return `{% block ${p1} %} {% endblock %}`; 
    })) 
    .pipe(gulp.dest(path.join(__dirname, 'after.html'))); 
}); 
+0

Sollte dies: Let Muster = neue RegExp (/ {% id _ (. {2,99})%} /, 'g'); In der Tat sein ?: let pattern = new RegExp ('{% id _ (. {2,99})%}', 'g'); https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions – Evans

+0

@Evans Sie sind austauschbar. Wenn Sie '' '' um Ihren Ausdruck verwenden, brauchen Sie nicht das '//' um den Ausdruck herum. Sie können '//' jedoch als tatsächliches Literal verwenden, wenn Sie es an eine RegExp übergeben. [Siehe hier] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Description). Wenn Sie jedoch '' '' um Ihren Ausdruck herum verwenden, müssen Sie weiterhin den Escape-Regeln für Strings folgen, wo Sie sich wie bei der Literal-Notation mit '//' keine Gedanken darüber machen müssen. – peteb