2016-06-08 8 views
0

Es gibt eine Datei mit vielen "Lore ipsum Bar Lore ipsum" und "Lorem ipsuem Foo Bar lorem ipsuem"RegExp: get Wort ohne Wort, bevor es

Wie alle Vorkommen von Bar erhalten, ohne Foo über RegExp (ignorieren Sie alle "Foo Bar", wählen Sie "Bar")?

Etwas wie:

^(?!.*Foo). Bar*$

??

+0

So ist es JavaScript? Was ist dein letztes Ziel? Erhalten Sie alle Übereinstimmungen oder ersetzen Sie sie durch etwas anderes? Siehe https://regex101.com/r/mU9wC3/1 –

+0

@ WiktorStribiżew richtig, JavaScript - müssen alle Vorkommen von Bar mit Foo Bar ersetzen, wobei bestehende Single-Bar unberührt bleiben. – Oleg

+0

Ich weiß, wie man es in 3 Schritten macht (ohne RegExp). Will es einfach mit RegExp machen. – Oleg

Antwort

1

Das ^(?!.*Foo). Bar*$ Muster matchersd eine Zeichenfolge, die Täter nicht Foo irgendwo in haben, und das beginnt mit einem beliebigen Zeichen, sondern eine neue Zeile, gefolgt mit einem Leerzeichen und dann endet mit Ba + null oder mehr r s. Ich bezweifle, dass du diese Regex im wirklichen Leben brauchst.

Sie können es mit einer Callback-Methode innerhalb einer replace Methode mit einem bekannten Regex-Trick zu entsprechen, was Sie nicht zuerst brauchen, und dann übereinstimmen und erfassen, was Sie brauchen.

Siehe this regex:

\bFoo Bar\b|(\bBar\b) 
^--match--^ ^-capture-^ 

ich die Worte mit Wortgrenzen eingewickelt, könnte man sie verwerfen, wenn Sie Sie suchen nicht Wort Zeichen am Anfang/Ende der Saiten haben.

var re = /\bFoo Bar\b|(\bBar\b)/g; // Declare the regex 
 
var str = 'lore ipsum Bar lore ipsum\nlorem ipsuem Foo Bar lorem ipsuem'; 
 
var subst = '<b>Foo Bar</b>';   // A sample substitution 
 
var result = str.replace(re, function($0, $1) { // Use the anonymous method 
 
    return $1 ? subst : $0;   // If Group 1 matches, use a subst, else, reinsert the match back 
 
}); 
 
document.body.innerHTML = result;

Verwandte Themen