2016-10-24 2 views
1

In diesem Fall versuche ich, ein Muster zu schaffen, das alles ABER ein | oder }} aber ich würde gerne verstehen, wie dies im Allgemeinen zu tun auch Fall.RegEx versucht, alles außer einem bestimmten Muster mit Zeichen aus dem Muster sein erlaubt

Das I möchte ein beliebiges Zeichen passen beliebig oft und zu stoppen, wenn ich getroffen entweder ein | oder ein }} So

[\w\s`[email protected]#\$%\^&\*\(\)-\+=\[\]\\;"',<\.>\/\?\{\}:]* 

und zurück, wenn ich getroffen }} oder |

Was Ich habe derzeit ist:

var regex = /[\w\s`[email protected]#\$%\^&\*\(\)-\+\=\[\]\\;"',<\.>\/\?\{\}\:]*(?!((\|)|(\}\})))/ 

dann etwas Hänge wie

var str = "abc}}"; 
str.match(regex) 

sollte abc zurückkehren, aber ich nach Stunden nicht einmal arbeiten, selbst

mit debuggex Dem Problem ich habe, bin ich auch so nur ein einziges } in meinem Spiel zu haben, erlaubt werden muß, nehmen die \} aus der ersten Gruppe funktioniert nicht. Ich verstehe nicht einmal, wie das möglich ist und in anderen Ausdrücken muss ich [anything but {{, {:, {{{, |, }}] erkennen können und ich kann die Logik nicht verstehen, um das zu kodieren. Auch für den Fall, dass ich ein Sonderzeichen verpasst habe, das maskiert werden muss oder einen redundanten Backslash hat, lass es mich wissen.

Antwort

1

Vielleicht so etwas wie folgt aus:

/(.+?)(\||}}||$)/ 

Das heißt:

  • (.+?) nicht gierige Capturing Spiel von einem oder mehreren von einem beliebigen Zeichen
  • (\||}}||$) Capturing Spiel von \| oder }} oder $ (Ende der Zeichenfolge).

Das Ergebnis Sie das erste aufgenommene Spiel wird sein wollen, das heißt, das zweite Element des Arrays von .match() zurückgegeben (falls es eine Übereinstimmung):

var regex = /(.+?)(\||\}\}|$)/; 
 
console.log("abc}}".match(regex)); 
 
console.log("abc}def}}".match(regex)); 
 
console.log("abc}123}456}}x".match(regex)); 
 
console.log("abc|def".match(regex)); 
 
console.log("abc".match(regex));

+0

Ich bin nicht sicher, das funktioniert. Ich denke das Problem ist, dass es immer noch}} als Teil von (. +) – WhiiteRussian

+0

gibt. Gibt es auch einen Grund für den $? Es sollte funktionieren können, auch wenn es nicht das Ende einer Zeichenkette ist, so etwas wie ** fett ** "abc}} 123" ** fett ** würde immer noch nur passen ** fett ** "abc" ** fett, aber es sollte auch in der Lage sein, etwas wie ** fett ** "abc} 123} 456}} x" ** fett ** und Übereinstimmung ** fett ** "abc} 123} 456" ** fett zu behandeln ** – WhiiteRussian

+0

Haben Sie auf "run code snippet" geklickt und sehen, dass es * funktioniert *? Wie ich im zweiten Punkt oben erwähnt habe, ist das '$' Teil einer Unterübereinstimmung, die mit '| * * oder *'}} '* oder * dem Ende der Zeichenkette übereinstimmt. Ich habe meine Antwort bearbeitet, um Ihr Beispiel "abc} 123} 456}} x" 'als einen meiner Testfälle einzuschließen. – nnnnnn

0

Diese sollte es tun:

var regex = /(.*[^}}|\|])/

Die () zeigen eine einfangende Gruppe an, so wie Sie in Ihrem Beispiel abc zurückgeben.

Allgemeinen übersetzt:

.* eine beliebige Anzahl von beliebigen Zeichen ...

[^ Ausnahme ...

}}|\|]}} oder |.

(Tip - https://regex101.com/ ist ein ziemlich praktisches Werkzeug zum Erzeugen und reguläre Ausdrücke zu testen.)

+0

'[^' wird verwendet, um irgendetwas anderes als die * einzelnen * Zeichen, die folgen, zu vergleichen, also können Sie es nicht für '[^}}' verwenden ... – nnnnnn

+0

Unglaublich! das ist so viel einfacher. Also für den Fall, dass ich etwas anderes als {{, {:, {{{, |,}} brauche, würde ich einfach die gleiche Logik anwenden und durch diese 5 am Ende des Ausdrucks? – WhiiteRussian

+0

Oder nicht .. lass mich das überprüfen – WhiiteRussian

Verwandte Themen