[RegEx] Zeichenketten finden, welche "foo" enthalten, ABER NICHT "bar"

beavisbee

Member of Honour
[RegEx] Zeichenketten finden, welche "foo" enthalten, ABER NICHT "bar"

ich versuche folgendes mit einem RegEx abzubilden:

der String soll "foo" enthalten, darf aber weder irgendwo davor noch irgendwo danach "bar" enthalten

Code:
foo tralalala moooh --> match!
tralala foo lalelu --> match!
tralala bar foo lalelu --> NO!
bar tralala foo lalelu --> NO!
tralala foo bar lalelu --> NO!
tralala foo lalelu bar --> NO!

ein Kollege hat mich schon auf das Stichwort lookahead / lookbehind gebracht, diese jedoch funktionieren nur, wenn ein Wort direkt vor oder nach dem anderen Wort folgen... was in meinem Fall nicht der Fall ist.

Habe bisher einige Foren durchstöbert... ohne Erfolg...

mein Ziel ist es, einen String zu manipulieren, dessen Regeln mittels eines assoziativen Arrays (regex=>replace) definiert werden... daher kommt also ein Aufsplitten in einzelne Abfragen nicht in Frage.

Aber ich vermute fast, dass ich die Idee aufgeben muss... aber vielleicht findet sich hier noch ein schlauer Kopf, der 'ne RegEx-Lösung formulieren kann...
 
Zuletzt bearbeitet:

Darkslide

New member
Ich hätte eine Lösung ohne Regex (soweit bar nicht mit anderen Buchstaben vorkommt z.B. barab:

Pseudo-Pseudocode :)

string = "foo tralala bar buz"
string.split(" ") //->{"foo", "tralala", "bar", "buz"}

if "foo" in array and not "bar" in array:
tu es
else
lass es
 

beavisbee

Member of Honour
wie gesagt: so ein Vorschlag bringt mir überhaupt nix und selbst das Aufsplitten in einzelne Ausdrücke bringt mich nicht weiter, da im Endeffekt einfach ein Array durchlaufen werden soll, in dem verschiedene Ersetzungs-Regeln durchlaufen werden sollen...

Daher bitte nur Lösungen, wie man das Ganze in einem RegEx formulieren kann...
(oder logische Erklärungen, warum es überhaupt nicht möglich ist, falls dem so wäre)
 

mime

Stammuser
ich versuche folgendes mit einem RegEx abzubilden:

der String soll "foo" enthalten, darf aber weder irgendwo davor noch irgendwo danach "bar" enthalten

Code:
#!/usr/bin/env perl 

use strict;
use warnings;

my @lines = (
             "foo tralalala moooh",
             "tralala foo lalelu",
             "tralala bar foo lalelu",
             "bar tralala foo lalelu",
             "tralala foo bar lalelu",
             "tralala foo lalelu bar");

foreach (@lines) {
  
  if($_ =~ m/(?!.*bar)^.*foo/) {

    print $_ . " TRUE\n";

  } 

}
Code:
mime@kira[16]: ~ 0)$ perl /tmp/bla.pl 
foo tralalala moooh TRUE
tralala foo lalelu TRUE
HTH

Micha
 

beavisbee

Member of Honour
Danke, du bist mein Held! :thumb_up:

PHP:
<?php
$lines = array(
    "foo tralalala moooh",
    "tralala foo lalelu",
    "tralala bar foo lalelu",
    "bar tralala foo lalelu",
    "tralala foo bar lalelu",
    "tralala foo lalelu bar"
);
foreach ($lines as $line) {
    echo $line;
    if(preg_match('/(?!.*bar)^.*foo/', $line)) {
        echo ' - MATCH' . chr(10);
    } else {
        echo ' - FAIL' . chr(10);
    }
}

Code:
martin@ThinkTux510:~$ php test.php
foo tralalala moooh - MATCH
tralala foo lalelu - MATCH
tralala bar foo lalelu - FAIL
bar tralala foo lalelu - FAIL
tralala foo bar lalelu - FAIL
tralala foo lalelu bar - FAIL

und ich zerbrech mir da seit Freitag den Kopf drüber.... :D
 
Oben