javascript - Matcha alla rader som börjar med fyra mellanslag


Jag försöker omsluta alla rader som börjar med 4 mellanslag med pre-taggar. Det här är vad jag har hittills

Text = Text.replace(new RegExp("( {4}.+?)<br />", "g"), "$1\n");
Text = Text.replace(new RegExp("( {4}.+?)\n", "g"), "<pre class=\"brush: js;\">$1</pre>");

Det fungerar men det omsluter varje rad i en pre. Jag behöver att det omsluter hela blocket.

Svar #1

Kanske skulle något som detta fungera? Det matchar flera rader i rad..

( {4}.*(\n {4}.*)*)\n

Svar #2

Behöver du verkligen göra detta med reguljära uttryck? Regexar är häftiga och användbara men de är inte det enda verktyget i din verktygslåda och ibland är det bäst att göra något enkelt och gå vidare till riktiga problem. Jag skulle bara dela upp det i rader och analysera det rad för rad med en ackumulator för de saker som behöver förbehandlas:

var lines = text.split('\n');
var pre   = [ ];
var out   = [ ];
for(var i = 0; i < lines.length; ++i) {
    if(lines[i].match(/^    /)) {
        pre.push(lines[i]);
    }
    else if(pre.length > 0) {
        out.push('<pre>' + pre.join('\n') + '</pre>' + '\n');
        out.push(lines[i]);
        pre = [ ];
    }
    else {
        out.push(lines[i]);
    }
}
if(pre.length > 0) {
    out.push('<pre>' + pre.join('\n') + '</pre>' + '\n');
}
text = out.join('\n');

Det kanske inte är lika smart som ett obegripligt regex, men åtminstone kommer du att kunna förstå vad det gör sex månader framöver.

http://jsfiddle.net/ambiguous/tFNyv/