| Autor |
Beitrag |
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mi 30.09.09 12:18
Da bei Regular Expression der . als ein beliebiges Zeichen verwendet wird, muss du diesen Escapen.
D.h. willst du wirklich einen Punkt in deinem Pattern verwenden muss du ihn mit einem Backslash angeben \.
C#-Quelltext 1:
| new Regex("(TABLE).*?\.\r") |
Das Pattern matched nun von TABLE bis .Zeilenumbruch. Bezüglich des Zeilenumbruches musst du dir noch die RegEx Options (siehe bakachan) anschauen.
Gruß Daniel
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mi 30.09.09 13:30
Ja habe jetzt wegen den RegOptions mal etwas nachgelesen und bin der Meinung ich brauche die Multline funktion. Hab sie dann eingebaut!
C#-Quelltext 1:
| Regex FIND = new Regex("(FIND).*?\.\r", RegexOptions.Multiline); |
Aber mir wird gesagt das "\." = Fehler 1 Nicht erkannte Escapesequenz.
Mache ich ein zweites \ dran, geht es aber er lässt alle strings aus, die länger als eine Zeile sind!
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Mi 30.09.09 13:41
M-Cha hat folgendes geschrieben : | | Ja habe jetzt wegen den RegOptions mal etwas nachgelesen und bin der Meinung ich brauche die Multline funktion. |
| Zitat: | RegexOptions.Multiline - Multiline mode. Changes the meaning of ^ and $ so they match at the beginning and end, respectively, of any line, and not just the beginning and end of the entire string.
RegexOptions.Singleline - Specifies single-line mode. Changes the meaning of the dot (.) so it matches every character (instead of every character except \n). |
und jetz denk mal drüber nach was wohl besser geeignet ist
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mi 30.09.09 14:06
Oh man. Manchmal sollte ich gründlicher lesen. Singleline natürlich!
MULTILINE: Mehrzeilenmodus. Ändert die Bedeutung von ^ und $, sodass sie jeweils dem Anfang und Ende einer beliebigen Zeile und nicht nur dem Anfang und Ende der gesamten Zeichenfolge entsprechen.
SINGLELINE: Gibt den Einzeilenmodus an. Ändert die Bedeutung des Punktes (.), sodass dieser jedem Zeichen entspricht (und nicht mit Ausnahme von \n).
Leider stimmt da was mit dem Punkt nicht so wie mir geraten wurde!
\. = Nicht erkannte Escapesequenz
So sieht es aus:
C#-Quelltext 1:
| Regex FIND = new Regex("(FIND).*?\.\r", RegexOptions.Singleline); |
Zuletzt bearbeitet von M-Cha am Mi 30.09.09 14:11, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 30.09.09 14:08
M-Cha hat folgendes geschrieben : | | \. = Nicht erkannte Escapesequenz |
Was Backslashes in C#-Strings bewirken, gehört eigentlich zu den absoluten Grundlagen. Entweder escapesst Du mit noch einem Backslash oder Du schreibst ein "@" vor den String, dann werden die Backslashes nicht als Escape-Zeichen angesehen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
JasonDelife
      
Beiträge: 81
Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
|
Verfasst: Mi 30.09.09 15:00
Damit nicht alles doppelt kommt.
Hier wurde das von M-Cha auch gefragt: forum.fachinformatik...4-regex-pattern.html
Grüße, JasonDelife.
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mi 30.09.09 15:24
Super hat geklappt! War das eine schwere Geburt!
Danke allen für die Hilfe! Muss jetzt noch paar andere Dinge auslesen usw....
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Do 01.10.09 14:46
Da ich kein neus Thema öffnen möchte , frage ich hiermal nach.
Ich habe ja jetzt meine String.
"Wort1 T1 T2 T3 T4 sdfkjk ckjkjgk ksdfjksdjfkl sklfjskjf Wort2";
Aus meinen String möchte ich noch etwas auslesen! Das Problem das Wort steht an ungleichenstellen!
Davor steht meistens das Wort "Verein, Platz, Spiel" und dann folgt das gesuchte Wort.
Manchmal steht da nur VErein oder Verein, Spiel und dann das gesuchte Wort!
Kann man mit Regex das regeln, das er die Wörter Verein, Platz, Spiel ignorieren soll und dann das darauffolgende Wort ausgeben soll?
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 01.10.09 15:04
Na klar kann man das machen
Versuch so ein Pattern:
"Wort1.*?((Verein)|(Platz)|(Spiel)|(\s)|(,))*?Wort2"
Du sagst im Prinzip beliebig oft der inhalt der äußeren Klammer ()* und in der Inhalt soll entweder Verein Platz oder Spiel sein. Ausserdem dürfen darin noch Leerstellen und Kommas vorkommen.
Nur mal so ein Tipp: Mit Regulären Ausdrücken solltest du immer versuchen alles genau zu definieren und möglichst wenig mit beliebigen Zeichen arbeiten. mit (?<name>AUSDRUCK) kannst du zum Beispiel named groups erstellen. Die haben den Vorteil, dass man später einfach drauf zu greifen kann, sich die Reihenfolge ändern kann und vorallem es viel lesbarer ist.
Gruß Daniel
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Do 01.10.09 15:29
Also ich habe jetzt folgenden RegEX
C#-Quelltext 1:
| "(?i)TABLE.*?((Verein)|(PLATZ)|(SPIEL)|(\\s)|(,))*?\\s" |
Das (?i) steht ja für Groß als auch kleinschreibung sind erlaubt. Danach soll er das Wort TABLE suchen! Nach dem TABLE können folgende Wörter noch auftauchen VEREIN, PLATZ, SPIEL. Also alle (TABLE VEREIN PLATZ SPIEL, oder nur 3 (FIND VEREIN PLATZ), oder nur 1 (FIND).
Wenn diese Wörter direkt nachdem FIND nicht vorkommen, soll er mir das darauffolgende Wort auslesen bis zum nächsten Leerzeichen!
Leider ließt er mir den ganzen String vom FIND aus!
Zuletzt bearbeitet von M-Cha am Do 01.10.09 15:32, insgesamt 1-mal bearbeitet
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 01.10.09 15:51
Gib mal dein Input-String...
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Fr 02.10.09 13:44
TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;
Er soll jeweils das nächste Wort auslesen das nicht (Spiel, Platz, Verein oder TABLE ist)
In dem Fall wäre es dortmund!
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Regex TABLE = new Regex("(?i)TABLE.*?((VEREIN)|(PLATZ)|(SPIEL)|(\\s)|(,))*?\\s", RegexOptions.Singleline);
MatchCollection ne = TABLE.Matches(fd[i].Value);
for (int j = 0; j < ne.Count; j++) { Console.WriteLine("Position: " + ne[j].Index); Console.WriteLine("STRING Wort: " + ne[j].Value); } |
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Fr 02.10.09 14:03
man.. dir zu helfen ist echt sau schwierig, bei denen Angaben!
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| string input = "TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;"; string pattern = @"((TABLE)|(VEREIN)|(SPIEL)|(PLATZ)|(\s))* (?<Verein>.*?) .*";
Match match = Regex.Match(input, pattern);
if (match.Success) { Console.WriteLine(string.Format("Verein: {0}", match.Groups["Verein"])); } |
Ich wollte den konkreten input string und nicht wieder ein unvollständiges Beispiel von dir. Beim anpassen auf deinen String wirst du wieder über eine Kleinigkeit stolpern weil du es nicht verstanden hast was wir dir versuchen zu erklären.
Wir versuchen die Antworten auch Verständlich und Vollständig zu formulieren, damit du was damit anfangen kannst.
Gruß Daniel
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Di 20.10.09 12:08
Anwort hat alles Super geklappt! Hab jetzt noch ein kleines Probelem was mir aufgefallen ist.
Das Wort was ich suche seht manchmal auch in einem Kommentar drin!
Das merkmale wäre dann, das er alle String ausgeben soll, die nicht in dem Kommenatr zwischen "/*" und "*/" stehen.
So sieht der Patter zur zeit aus: Regex test = new Regex("(?i)(HAUS).*?\\.\r", RegexOptions.Singleline);
Ich möchte den so umändern, das er mir den String mit dem WOrt "Haus ausgibt, aber nicht den der zwischen den Kommentarzeichen steh bzw. bei denen ein // oder /* vor steht. Zusäzlich kann es sein, das der String mit einem "over." enden soll und nur mit einem punkt.
Beispiel Auszug Datei:
Haus 23 Rasenplatz Test over.
gfdgdfg
dgfd
gdfgdf
Haus 49 Rasenplatz Test.
/* Haus ende */
Der soll nur die Strings ausgeben, die nicht zwischen den Kommentarzeichen stehen!
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mi 11.11.09 12:00
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mo 16.11.09 10:37
So hab alles jetzt rausbekommen nur noch eine Kleinigkeit!
C#-Quelltext 1:
| Regex test = new Regex("(?i)(HAUS).*?\\.\r", RegexOptions.Singleline); |
Habe diesen Patter!
Er geht durch eine Textdatei und soll alle strings auslesen die mit "Haus" anfangen und mit einem Punkt+Zeilenumbruch enden!
Jetzt möchte ich das er alle Strings von "Haus" bis zum Wort "KAUF" bzw. "MIETE" liest!
Irgend ein Wort von den Beiden steht immer drin!
Wenn ich es so mache funktioniert es nicht richtig!
C#-Quelltext 1:
| Regex test = new Regex("(?i)(HAUS).*?(KAUF)|(MIETE)", RegexOptions.Singleline); |
Er liest dann von Haus bis KAUF aber nicht beim nächsten wenn miete mal drin steht statt kauf!
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 16.11.09 11:07
Hallo,
parst du nun eine Tabelle mit :
TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;
oder einen Wohnungsmarkt mit:
"Haus" bis zum Wort "KAUF" bzw. "MIETE" liest!
??
Du solltest deine Fragen so konkret wie Möglich stellen um eine Antwort zu bekommen die dir weiter hilft.
Und zwei verschiedene Topics zu mischen verwirrt noch mehr.
Darüber hinaus ist dein Titel auch total ungeeignet.
Bitte mal überarbeiten, sonst wirst du auch weiterhin nur mit dir selber posten.
mfg Daniel
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mo 16.11.09 11:33
danielf hat folgendes geschrieben : | Hallo,
parst du nun eine Tabelle mit :
TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;
oder einen Wohnungsmarkt mit:
"Haus" bis zum Wort "KAUF" bzw. "MIETE" liest!
??
Du solltest deine Fragen so konkret wie Möglich stellen um eine Antwort zu bekommen die dir weiter hilft.
Und zwei verschiedene Topics zu mischen verwirrt noch mehr.
Darüber hinaus ist dein Titel auch total ungeeignet.
Bitte mal überarbeiten, sonst wirst du auch weiterhin nur mit dir selber posten.
mfg Daniel |
Ja an einer Stelle habe ich ja Vereine geparst! Vorher aber habt ihr mir erklärt wie ich ganze Strings parse! JEtzt ist mir aufgefallen es gibt eindeutigere Merkmale wo so ein String enden kann! Das Wäre am KAUF oder MIETE!
Soll bei HAUS anfangen und dann bei HAUS oder MIETE aufhören!
Jetzt möchte ich aus einer Datei die aus mehreren Zeilen besteht folgendes parsen!
- Jeweils den String vom Wort "Haus" bis zum nächsten Wort "Kauf" oder "Miete"!!!
Eins von den beiden ist immer dabei!
Mein alter Parser war ja so:
C#-Quelltext 1:
| Regex FIND = new Regex("(?i)(HAUS).*?\\.\r", RegexOptions.Singleline); |
Der neue Parser soll dann die Strings bis zu den Wörtern filtern! Nicht wie der alte zum Punkt+Zeilenumbruch!
Dise Strings gebe ich ja dann aus! Brauche nur den passenden Parser!
So sieht ungefähr die Datei aus! Ist eine Testdatei:
Quelltext 1: 2: 3: 4: 5:
| Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst Kauf // Kommentar// Text Text Text Text Text Text Text
Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst MiETE |
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 16.11.09 12:31
string pattern = @"Haus.+(Kauf|MiETE)";
Edit:
string pattern = @"Haus.+?(Kauf|MiETE)";
(none greedy)
Zuletzt bearbeitet von danielf am Mo 16.11.09 13:19, insgesamt 2-mal bearbeitet
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mo 16.11.09 12:49
danielf hat folgendes geschrieben : | | string pattern = @"Haus.+(Kauf|MiETE)"; |
Danke aber leider macht er das nicht. Er gibt das ganze Aus! Das heißt von:
Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft
sffsdsts sfdttst Kauf
// Kommentar//
Text Text Text Text Text Text Text
Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft
sffsdsts
sfdttst MiETE
C#-Quelltext 1:
| Regex FIND = new Regex(@"(i?)(HAUS).+(KAUF|Miete)", RegexOptions.Singleline); |
Der String sollte ja dann bei Kauf auch geschnitten werden!
________________________________________________________________________________________________________________________
Habe es rausbekommen! Richtig ist der hier:
C#-Quelltext 1:
| Regex FIND = new Regex("(?i)(HAUS).*?(Kauf|Miete)", RegexOptions.Singleline); |
Funktioniert wunderbar! Danke trotzdem!
|
|