2017-08-22 2 views
1

SCOPEWie ein Zeichen passen, aber nicht, wenn sie in Anführungszeichen

Lets streng geschlossenen sagen wir hello how are you dog? "d" I am "good" "g" ha good

REQUIREMENT

einen String haben möchte ich einen regulären Ausdruck, die das Vorkommen gibt von d oder g, aber nicht, wenn sie strikt (kein anderes Zeichen) in Anführungszeichen eingeschlossen sind.

in der obigen Zeichenfolge So würden die angepassten Vorkommnisse werden (eingeschlossen in {}) hello how are you {d}o{g}? "d" I am "{g}oo{d}" "g" ha {g}oo{d}

EDIT

ich so etwas wie dies versuchen:

//constructing a regex 
re = RegExp(`(d|g)`, 'g') 
newString = "" 
'hello how are you dog? "d" I am "good" "g" ha good' 
.split(re).map((word, index) => {  
    if (word.match(re) != null) { 
     console.log("match") 
     newString += "|" //replacement character 
    } else { 
     newString += word 
    } 
}) 

HINWEIS

Ich arbeite in Javascript. Konnte nicht mit einem Muster kommen.

Dank

+0

Sie müssen auch einen Code für ein hinzufügen Regex in diesem Fall zu arbeiten. Extrahieren oder ersetzen Sie? –

+0

Nur um Sie wissen zu lassen, dass ich ersetze. – gaurav414u

+1

Entfernen oder Ersetzen mit einem anderen Wert? Bitte vervollständige den Testfall in der Frage. –

Antwort

0

Hier ist eine Art und Weise tun:

Mit string ‚s replace, Funktion Methode verwendet, und die Regex

("[^"]*"|[^dg])|. 

Sie überprüfen können, ob die Erfassung alles passt . Wenn nicht, ist die Übereinstimmung d oder g, die Sie ersetzen/entfernen/umwandeln möchten (oder was auch immer). Im Beispiel mache ich es in Großbuchstaben.

Erläuterung:

Die Regex zuerst versucht, ein doppeltes Anführungszeichen entsprechen - "[^"]*". Wenn das zu den Captures passt. Wenn dies nicht der Fall ist, wird versucht, ein Zeichen anderes als d oder g - [^dg] abzugleichen und zu erfassen.

Wenn eines der obigen Ergebnisse übereinstimmt, wird es an die Funktion als Parameter b gesendet.

Wenn keine der Übereinstimmungen, wird die vollständige Übereinstimmung als Parameter a gesendet, und das wäre die endgültige Alternierung, außerhalb der Klammern ..

So kann die Funktion entweder bekommt einen gültig Zeichen/Zeichenfolge im b Parameter oder eine ungültig ein in a. Wenn b undefiniert ist, handeln und tun Sie was auch immer auf a, andernfalls einfach b zurückgeben.

var str = 'hello how are you dog? "d" I am "good" "g" ha good'; 
 

 
document.write(str.replace(/("[^"]*"|[^dg])|./g, function(a, b) { 
 
    if(b==undefined) 
 
     return a.toUpperCase(); 
 
    return b; 
 
    }));

+0

Ich habe den Teil "(kein anderes Zeichen)" verpasst: S - also etwas mehr als gefragt (Griffe d 's und g' irgendwo in einer Zeichenkette), funktioniert aber immer noch, wenn sie * alleine * sind. – ClasG

0

Sie benötigen einen regulären Ausdruck, das die Teil übereinstimmen Sie nicht brauchen (jene, die Sie ersetzen wird), und Spiel und erfassen, was Sie halten müssen. Ich nehme an, Sie möchten "g" und "d" behalten. Verwenden Sie

/("[gd]")|[dg]/g 

Siehe regex demo

Und den Code, der die endgültige Arbeit erledigt:

var rx = /("[gd]")|[dg]/g; 
 
var s = 'hello how are you dog? "d" I am "good" "g" ha good'; 
 
var res = s.replace(rx, function($0,$1) { 
 
    return $1 ? $1 : "|"; 
 
}); 
 
console.log(res); // => hello how are you |o|? "d" I am "|oo|" "g" ha |oo|

Also, die ("[gd]") Spiele und fängt "g" oder "d" in Gruppe 1 und wenn es übereinstimmt, wird der Wert du wieder eingefügt Ringersatz (siehe $1 ? $1), sonst werden alle d oder g in anderen Kontexten mit [dg] abgeglichen und dann in der Callback-Methode ersetzen ersetzt.

0

summarise Anforderungen

  • mindestens 2 Buchstaben im Angebot
  • umfasst Anzeige oder ag

Dann regexp = /"(?=g|d)[^"]{2,}"/gi

  1. beginnt mit einem doppelten Anführungszeichen
  2. Look-Ahead suchen nach ag oder d
  3. sollte 2+ Buchstaben folgt sein (beinhaltet die g oder d)
  4. endet mit einem doppelten Anführungszeichen

Test

(`no quote = dog god d g 
1 letter only = "d" "g" 
2+ letters = "go" "do" "dog" "god", "GoOD" 
`).match(/"(?=g|d)[^"]{2,}?"/gi) 
// ["go", "do", "dog", "god", "GoOD"] 
// then do what you want.. 
Verwandte Themen