2016-11-30 6 views
-2

Viele ähnliche Fragen existieren bereits, aber sie lösen mein Problem nicht. Nun, wenn das gesagt ist, nehme ich an, ich habe einen Satz - "Patient wurde bewegt, um zur Beobachtung zugelassen zu werden" und ich möchte nur den Teil "zu - - - - Beobachtung" zusammenbringen "Nun, wenn ich" für obs "/" für Beobachtungen "innerhalb des Satzes" zu - - - - Beobachtung "möchte ich dann nicht übereinstimmen.Eine Übereinstimmung ausschließen, wenn sie ein Regex-Muster enthält

Meine Regex sieht wie folgt aus:

(\bin\b|\bto\b|\badmit\b).{0,100}(observation\b|\bobserve\b|\bobs\b) 

aber wenn ich negativ Blick verwenden voraus wie so (noch?!):

(\bin\b|\bto\b|\badmit\b).{0,100}(?!(for))(observation\b|\bobserve\b|\bobs\b) 

es passt immer noch alles. Was ich brauche, um die Regex zu erreichen, ist, wenn sie "zur Beobachtung/Beobachtung/Beobachtung" zugeben muss. Aber wenn es "für Beobachtungen geben/für obs/in Beobachtungen" gibt, wird es nicht übereinstimmen.

Update: Die folgende Regex gibt so ziemlich die Ausgabe, die ich wollte.

((\bin\b|\bto\b)(?!.*for.*(?:\bobs\b|observations\b)).{0,100}(observation\b|\bobserve\b|\bobs\b))|((observation\b|\bobserve\b|\bobs\b).{0,100}(\bstatus\b|\bplace\b|time\b))|(\b(status|place[d]?|placing|admit(?:ted)?|(?:ting)?|start|time|move[d]?)\b.{0,100}(observation\b)) 
+0

verwenden Sie eine bestimmte andere Sprache als reguläre Ausdrücke? – npinti

+1

Die Frage ist unklar. Bitte klären Sie mit einigen Beispieltext und erwarteten Ergebnissen. Fügen Sie außerdem das Tool/Sprache-Tag hinzu. –

+0

Ich benutze http://regexr.com/, ich brauche nur den normalen Regex. Ich habe die Frage und den angehängten Screenshot aktualisiert. Danke – feather

Antwort

0

Sie haben nicht die Regex Geschmack angegeben, aber wenn es unterstützt Look-behinds, versuchen

\b(in|to|admit)\b.{0,100}(?<!for\s)\b(observation|observe|obs)\b 

See it here at regex101.

Was Ihr negativer Vorgriff tut, ist, dass keines der Worte zu überprüfen observation, observe, obs mit for beginnen, das ist ziemlich offensichtlich, dass sie sich nicht tun;)

bearbeiten

OK, also ist es JS. Sie könnten versuchen, so etwas wie:

\b(in|to|admit|was)\b.{0,100}(?!\bfor)...\s(observation|observe|obs)\b 

Es einfach sicher vor dem Schlüsselwort die Zeichen macht, ist nicht for. (Es müssen jedoch mindestens drei Zeichen vor dem Wort vorhanden sein.)

Example here at regex101.

(ich dort ein wenig freewheeled haben;)

+0

der Regex-Geschmack ist Javascript und es gibt Musterfehler in js, aber danke für Ihren Beitrag. Ich habe die Frage auch aktualisiert – feather

+0

Verwenden Sie eine optionale Erfassungsgruppe, und überprüfen Sie, ob es nicht definiert ist. Wenn ja, schnapp dir das Streichholz, sonst verwerfe. –

+0

Das ist nicht der Fall, ich gehe davon aus, dass nach "für" gibt es 3 Zeichen und dann die Schlüsselwörter, in meinem Fall kann es eine beliebige Anzahl von Zeichen vor den Schlüsselwörtern @ClasG – feather

0

Sie können mit (\bfor\s+)? überprüfen, ob es for ist + Raum (e) vor dem observation, observe usw. und wenn die for abgestimmt ist, verwerfen Sie das Spiel greifen, sonst es:

var regex = /\b(in|to|admit|was)\b.{0,100}?(\bfor\s+)?(observation|observe|obs)\b/g; 
 
const str = "late case manager feels safest to admit for obs as pt lives ...\nw pt case manager wil to admist obs 1930 pt"; 
 
var m, res=[]; 
 
while ((m = regex.exec(str)) !== null) { 
 
    if (m[2] === undefined) { 
 
     res.push(m[0]); 
 
    } 
 
} 
 
console.log(res);

+0

Ich habe herausgefunden, was funktioniert: http://regexr.com/3epjq, vielen Dank – feather

+0

Mein Ansatz ist viel sauberer. Außerdem, einfacher zu pflegen und zu erweitern. –

+0

Ihre Lösung entspricht fast allem, was ich nicht anpassen möchte, Sie können sich selbst sehen, indem Sie einfach die Regex in meinen Link einfügen. – feather

Verwandte Themen