Laden...

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

Erstellt von M-Cha vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.390 Views
M
M-Cha Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren
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"]));
                }
49.485 Beiträge seit 2005
vor 14 Jahren

Hallo M-Cha,

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

herbivore

M
M-Cha Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

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

so dann?:

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

M
M-Cha Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

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!

49.485 Beiträge seit 2005
vor 14 Jahren

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

M
M-Cha Themenstarter:in
10 Beiträge seit 2009
vor 14 Jahren

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?

49.485 Beiträge seit 2005
vor 14 Jahren

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

467 Beiträge seit 2007
vor 14 Jahren

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.

49.485 Beiträge seit 2005
vor 14 Jahren

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

467 Beiträge seit 2007
vor 14 Jahren

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

49.485 Beiträge seit 2005
vor 14 Jahren

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

467 Beiträge seit 2007
vor 14 Jahren

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