Laden...

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

Letzter Beitrag vor 14 Jahren 12 Posts 3.445 Views
Regex Pattern am ENDE auf KLammer oder Leerzeichen prüfen?

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"]));
                }

Hallo M-Cha,

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

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>.?)(.*";

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!

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

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?

Hallo M-Cha,

Hab es noch nicht genua getestet

Das kannst du mit On-the-fly Regex-Tester: Regex-Lab tun.

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

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.

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

Danke. Das ist schon mal peinlich, dass ich das nicht wusste.
IgnoreCase heißt also: ignoriert Groß-klein Schreibung, richtig?

Hallo ANSI_code,

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

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

😁 Ich habe mir die msdn Seite sogar angeschaut - leider auf englisch. Da steht dann eine sehr informative erkärung zu IgnoreCase:

Specifies case-insensitive matching.

desshalb war ich mir nicht sicher. Jedenfalls vielen Dank.