Eine bestimme Anzahl an Zeichen zwischen 2 Zeichen erkennen


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
#1
Guten Tag,

vielleicht kann mir jemand von euch helfen.
Ich versuche über die "Regular Expressions" eine bestimmt Anzahl (8) an Zeichen die zwischen 2 Zeichen stehen zurückzugeben.
Leider ist es dar Fall wenn ich die Mengenangabe "{8}" auf 7 angebe, dann gibt es auch ein gültiges Resultat.
Ich möchte eine Rückgabe nur wenn die Anzahl der Zeichen zwischen den Zeichen '_' und '_' mit 8 stimmt.
Wenn ich die Suche nach der Anzahl von 7 Zeichen möchte, darf kein Resultat zurückkommen.

Hier der Inhalt des Suchstrings:
C#:
string strDateTime = BOM_OUT_22010801_100207.txt
C#:
Match mDate;

mDate = Regex.Match(strDateTime, @"_?[0-9]{8}_?"); //8 Ziffern von 0-9 zwischen den Zeichen '_' und '_' erkennen
mDate > _22010801_

Hier was ich nicht will, da sollte das Resultat mDate leer sein.
C#:
mDate = Regex.Match(strDateTime, @"_?[0-9]{7}_?"); //8 Ziffern von 0-9 zwischen den Zeichen '_' und '_' erkennen
Ist es aber nicht.
mDate > _2201080

Weiß jemand die korrekte Syntax?

Vielen Dank für eure Hilfe.
CopWorker
 

ComFreek

Mod | @comfreek
Moderator
#2
Weiß jemand die korrekte Syntax?
Deine Syntax ist korrekt, aber reflektiet eben nicht deine Intention.

"_?[0-9]{7}_?" bedeutet: ggf. ein _, aber ggf. auch nicht. Dann 7 Ziffern. Dann ggf. ein _, aber ggf. auch nicht.
Die Unterstriche sind nicht aneinander gekoppelt.

Du möchtest "_[0-9]{8}_", ggf. "_([0-9]{8})_", wenn du die Zahl extrahieren möchtest.
 
#3
Hallo ComFreek,

vielen Dank dafür.
Da habe ich mich zu sehr an das "?" geklammert.

Das Problem ist aber, dass ich nur nach einem Format suchen kann.
Wenn das von der linken Seite her nicht gefunden wird, so wird die Suche abgebrochen.
Ist es überhaupt möglich nach mehreren übereinstimmenden Textstellen zu suchen?
Meine Syntax:
C#:
strDateTime = "BOM_OUT_20190801_100207.txt";

mTime = Regex.Match(strDateTime, @"_[0-9]{6}."); //6 Ziffern von 0-9 zwischen den Zeichen '_' und '.' erkennen             
mDate = Regex.Match(strDateTime, @"_[0-9]{8}_"); //8 Ziffern von 0-9 zwischen den Zeichen '_' und '_' erkennen
Resultat:
mTime > "_2019080"
mDate > "_20190801_"

Bei mTime erwarte ich aber "_100207."

Die Suche kann man doch mit den Bereichskennzeichner ^ und $ eingrenzen.
Ein $ am Schluss der Syntax funktioniert aber auch nicht.


Viele Grüße
CopWorker
 
#4
Hallo ComFreek,

hier noch was nachgelegt.
Ich kann nach numerischen Zeichen beliebiger Länge suchen.
Vorausgesetzt die 2 Zeichen welche die gesuchten Zeichenketten einschließen sind gleich.

Syntax:
C#:
string strDateTime = BOM_OUT_22010801_100207_txt
mTime = Regex.Match(strDateTime, "(?<=_)[0-9]{6}(?=_)"); //6 Ziffern von 0-9 zwischen den Zeichen '_' und '_' erkennen
mDate = Regex.Match(strDateTime, "(?<=_)[0-9]{8}(?=_)"); //8 Ziffern von 0-9 zwischen den Zeichen '_' und '_' erkennen
Man achte auf den '_' vor "txt"
Unterscheiden sich aber die 2 Zeichen welche die gesuchte Zeichenketten einschließen
dann funktioniert es nicht mehr.
Ich finde dafür auch keine Lösung.
Auf der betreffenden Seite ist dieser Fall auch nicht gehandelt, oder ich verstehe es nicht.
Reguläre Ausdrücke - danielfett.de

Vielen Dank im Voraus
CopWorker
 

Sempervivum

Erfahrenes Mitglied
#5
Resultat:
mTime > "_2019080"
mDate > "_20190801_"

Bei mTime erwarte ich aber "_100207."
Des Rätsels Lösung ist, dass der Punkt bei Regex eine besondere Bedeutung hat: Genau ein beliebiges Zeichen. Um diese besondere Bedeutung aufzuheben, musst Du einen Backslash voranstellen:
"_[0-9]{6}\."
 

ComFreek

Mod | @comfreek
Moderator
#6
Ich kann nach numerischen Zeichen beliebiger Länge suchen.
Vorausgesetzt die 2 Zeichen welche die gesuchten Zeichenketten einschließen sind gleich.
Das verstehe ich auf Anhieb nicht. Hast du vielleicht ein konkretes String Beispiel, was *genau* du matchen möchtest? Und vielleicht auch ein Gegenbeispiel? :)

Das würde mir sehr helfen, Danke!
 
#7
Hallo zusammen,

die Lösung ist von Sempervivum genannt.
Der Punkt selber wird nicht als Zeichen erkannt wenn dies nicht explizit mit '\' gekennzeichnet ist.
Eigentlich eindeutig.
Dies war mein erster Gedanke.
C#:
mTime = Regex.Match(strDateTime, "(?<=_)[0-9]{6}(?=.)"); //6 Ziffern von 0-9 zwischen den Zeichen '_' und '.' erkennen
Und so ist es viel besser.
C#:
mTime = Regex.Match(strDateTime, @"(?<=_)[0-9]{6}(?=\.)"); //6 Ziffern von 0-9 zwischen den Zeichen '_' und '.' erkennen
Da habe ich nicht mehr daran gedacht.
Ich bin glücklich, alles läuft wie es soll.
Kaum macht man´s richtig, schon funktioniert´s.

Vielen Dank an alle.
Grüße von CopWorker
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…