Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Regex Pattern am ENDE auf KLammer oder Leerzeichen prüfen?
M-Cha
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

Regex Pattern am ENDE auf KLammer oder Leerzeichen prüfen?

beantworten | zitieren | melden

Ich habe einen Patter erstellt der mir nachdem WORT Haus+ Leeerzeichen ein Wort ausgeben soll bis zum nächsten Leerzeichen. Das macht er auch.

Jetzt möchte ich das er mir das Wort bis zur nächsten Offenen Klammer ausgeben soll bzw. leerzeicehn+klammer! Wie schreibe ich das am ENde?

   
string pattern = @"((?i)(HAUS)|(\s))*(?<Haus>.*?) .*";

                Match match1 = Regex.Match(rn[a].Value, pattern);

                if (match1.Success)
                {
                    Console.WriteLine(string.Format("Hausname: {0}", match1.Groups["Haus"]));
                }
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo M-Cha,

genauso, nur eben mit einer Klammer statt einem Leerzeichen. Wobei du die Klammer escapen musst, also \(

herbivore
private Nachricht | Beiträge des Benutzers
M-Cha
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

Zitat von herbivore
genauso, nur eben mit einer Klammer statt einem Leerzeichen. Wobei du die Klammer escapen musst, also \(

so dann?:

string pattern = @"((?i)(HAUS)|(\s))*(?<Haus>.*?)\(.*";
private Nachricht | Beiträge des Benutzers
M-Cha
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

Mein Problem beim Pattern ist doch etwas größer!

Die die Textdatei sieht ungefähr so aus bei mir:

HAUS bunt.1(dfgdfgdgdfgg
Haus lila-schwarz (dgdgdgdfgdf
Haus blau.bunt (
Haus rot-schwarz.golh
Haus rot-schwarz.blau bsdslsldlsl /*dfdffdfdf
Haus rot-schwarz.blau /*dfdffdfdf

Ich möchte NUR das zusammenängende Wort nach Haus ausgeben!

Wie muss der Pattern dazu heißen?

Der aktuelle Pattern sieht so aus:

string pattern = @"((?i)(HAUS)|(\s))*(?<Haus>.*?)\(.*";

Er gibt zurzeit das Wort nach RUN aus bis zur nächsten Klammer! Manchmal gibt es aber keine Klammer!
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von M-Cha am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo

naja, dann eben Leerzeichen oder Klammer also

( |\()

oder

[ \(]

Ich würde es dann aber eher umdrehen (und statt Leerzechen beliebige White-Spaces \s nehmen):

haus\s+(?<Haus>[^\s\(]+)

herbivore
private Nachricht | Beiträge des Benutzers
M-Cha
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

So hab ich es jetzt gemacht:

string pattern = @"((?i)(RUN)|(\s))+(?<Tabelle1>[^\s\(]+)";

Hab es noch nicht genua getestet müsste aber richtig sein oder?

Kannst du mir diesen Teil "+(?<Tabelle1>[^\s\(]+)" etwas genauerer erklären?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo M-Cha,
Zitat
Hab es noch nicht genua getestet
Das kannst du mit On-the-fly Regex-Tester: Regex-Lab tun.
Zitat
Kannst du mir diesen Teil "+(?<Tabelle1>[^\s\(]+)" etwas genauerer erklären?
Naja, was (?<Tabelle1>...) bedeutet, weißt du ja. Also bleibt [^\s\(]+ und das ist doch eigentlich selbsterklärend. Im Zweifel schau in der :rtfm: Doku (oder der F1-Hilfe von Regex-Lab) nach, was die eckigen Klammern bedeuten (Zeichenmenge) und dann noch, was das Dach ^ bewirkt, wenn es als erstes Zeichen in den eckigen Klammern steht (Negation).

herbivore
private Nachricht | Beiträge des Benutzers
ANSI_code
myCSharp.de - Member

Avatar #avatar-2839.jpg


Dabei seit:
Beiträge: 467
Herkunft: Bayern

beantworten | zitieren | melden

Eigentlich dachte ich, ich könnte RegEx.
Ich verstehe aber den Pattern überhaupt nicht.

((?i)(RUN)|(\s)) ist eine Gruppe, die mindestens 1mal vorkommt.

Was heißt denn bitte "(?i)" ???????
RUN kann kein Befehl sein , soll wohl "wörtlich" gemeint sein und kommt in der Datei auch vor?

erst kommt dieses komische "?i" als eine Gruppe, dann die zweite wo entweder "RUN" oder ein Whitespace-Zeichen.

Wie gesagt: Meine Fragen
Kommt "RUN" im Text vor
Was heißt (?i)

Hoffe das ist jetzt keine dumme Frage.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ANSI_code,

klar, RUN steht für die Zeichenfolge aus R, U und N.

(?i) schaltet für den Teilausdruck, der folgt, die Option RegexOptions.IgnoreCase ein.

Klarer und richtiger wäre aber eigentlich (?i:RUN)

herbivore
private Nachricht | Beiträge des Benutzers
ANSI_code
myCSharp.de - Member

Avatar #avatar-2839.jpg


Dabei seit:
Beiträge: 467
Herkunft: Bayern

beantworten | zitieren | melden

Danke. Das ist schon mal peinlich, dass ich das nicht wusste.
IgnoreCase heißt also: ignoriert Groß-klein Schreibung, richtig?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ANSI_code,
Zitat
Das ist schon mal peinlich, dass ich das nicht wusste.
man muss nicht alles wissen, aber man sollte wissen, wo es steht (bzw. wo man nachgucken kann). In diesem Fall Gruppierungskonstrukte, Zeile (?imnsx-imnsx: subexpression).
Zitat
IgnoreCase heißt also: ignoriert Groß-klein Schreibung, richtig?
Auch da kommt es eigentlich nur darauf an, wo man gucken muss: RegexOptions-Enumeration. :-) Zumindest wenn die Doku stimmen würde, was sie in diesem Fall ausnahmsweise mal nicht tut. Durch einen Übersetzungsfehler steht "berücksichtigt", obwohl es "ignoriert" heißen müsste:
Zitat von MSDN: RegexOptions-Enumeration
IgnoreCase
Gibt an, dass bei Übereinstimmungen die Groß- und Kleinschreibung berücksichtigt werden soll.

herbivore
private Nachricht | Beiträge des Benutzers
ANSI_code
myCSharp.de - Member

Avatar #avatar-2839.jpg


Dabei seit:
Beiträge: 467
Herkunft: Bayern

beantworten | zitieren | melden

[offtopic] Ich habe mir die msdn Seite sogar angeschaut - leider auf englisch. Da steht dann eine sehr informative erkärung zu IgnoreCase:
Zitat
Specifies case-insensitive matching.
desshalb war ich mir nicht sicher. Jedenfalls vielen Dank.
[/offtopic]
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ANSI_code am .
private Nachricht | Beiträge des Benutzers