Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

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

Diskussion: [RegEx] Zeichenketten finden, welche "foo" enthalten, ABER NICHT "bar" im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige ich versuche folgendes mit einem RegEx abzubilden: der String soll "foo" enthalten, darf aber weder irgendwo davor noch irgendwo ...

Antwort
Alt 05.09.11, 12:51   #1 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
erledigt [RegEx] Zeichenketten finden, welche "foo" enthalten, ABER NICHT "bar"

Anzeige

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...

Geändert von beavisbee (05.09.11 um 14:45 Uhr) Grund: marked as solved
beavisbee ist gerade online   Mit Zitat antworten
Alt 05.09.11, 13:54   #2 (permalink)
 
Registriert seit: 20.07.06
Darkslide Leistung: Facit NTK
Likes: 21
Standard

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
Darkslide ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 05.09.11, 14:20   #3 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

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)
beavisbee ist gerade online   Mit Zitat antworten
Alt 05.09.11, 14:20   #4 (permalink)
 
Registriert seit: 12.08.10
mime Leistung: Pentium Imime Leistung: Pentium I
Likes: 30
Standard

Zitat:
Zitat von beavisbee Beitrag anzeigen
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
__________________
http://www.openvas.org
mime ist offline   Mit Zitat antworten
Alt 05.09.11, 14:44   #5 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
erledigt

Danke, du bist mein Held!

PHP-Code:
<?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....
beavisbee ist gerade online   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » [RegEx] Zeichenketten finden, welche "foo" enthalten, ABER NICHT "bar"
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61