RegexFrage

DerD

Grünschnabel
Hallo Regex- Experten,

Ich bin relativ neu in dem Thema, und möchte folgendes tun:
Mein String sieht etwa so aus:
|guhk|h657|hiik|hhh
Ich möchte nun das 2. Und 3. Zeichen nach dem dritten |. Hier also "ii"
Kann mir da jemand weiterhelfen?

Danke für die Unterstützung
 

sheel

I love Asm
Hi

die genaue Syntax hängt davon ab, welches Regex-System verwendet wird (es gibt sehr viel unterschiedliche), aber ca. sowas sollte prinzipiell reichen:
Code:
\|[^\|]*\|[^\|]*\|[^\|]([^\|][^\|])
Zuerst ein |, mit \ vorne damit es als Text und nicht Regex-Steuerzteichen aufgefasst wird.
Dann beliebig viele (mit *) Zeichen, und zwar beliebige außer dem | mit [^]
Dann wieder ein | und wieder beliebig viele andere Zeichen, und wieder ein |.
Dann ein einzelnes anderes Zeichen, und dann noch zwei die eingeklammert sind
damit sie als Teilergebnis rausextrahiert werden können
 

Yaslaw

n/a
Moderator
Je nach Sprache varieren die Dailekte vonRegExp ein wenig.
Bei manchen geht auch Test bei regex101.com
Code:
^(?:[^\|]*\|){3}.(.{2})
3 * Ein Zeichen das kein | ist gefolgt von einem |
Dann ein beliebiges Zeichen
Dann 2 beliebige Zeichen als Rückgabewert

Nachtrag:
Geht sogar bei VBA. Von daher ists nicht so komplex :)
print_r(), cRegExp()
Visual Basic:
print_r cregexp("/^(?:[^\|]*\|){3}.(.{2})/").execute("|guhk|h657|hiik|hhh")
<IMatchCollection2>  (
    [0] => <IMatch2>  (
        [Match] => <String> '|guhk|h657|hii'
        [FirstIndex] => <Long> 0
        [SubMatches] => <ISubMatches>  (
            [0] => <String> 'ii'
        )
    )
)
 
Zuletzt bearbeitet:

DerD

Grünschnabel
Schon mal vielen Dank!
Werde auch die 2.te Lösung ausprobieren ( die erste hat wohl wegen der C# Umgebung nicht funktioniert, vermute ich)
 

DerD

Grünschnabel
Frage zu
^(?:[^\|]*\|){3}.(.{2})
Das ^ gibt den Anfang des String an.
Das [^\|] heisst kein|
Das * beliebig oft
Was heisst "?:" ?
Was ist mit dem | am Anfang?
Was bedeutet der "." in "{3}. ("?
 

Yaslaw

n/a
Moderator
Die verlinkte Seite zu regex101 hat die ganzen Erklärungen aufgelistet

2017-07-03_160202.png

(?:.....) bedeutet, diese Klammer ist kein Rückgabewert sondern eine logische Klammer
(?:....){3} bedeutet, diese Logik kommt 3 mal hintereinander vor
| am Anfang: Was soll damit sein? Es kommt am Anfang kein bis unbegrenzt Zeichen vor, die kein | sind. Am Anfang also keines

Übersetzung von ^(?:[^\|]*\|){3}.(.{2})
^
Textbeginn
(?:[^\|]*\|){3} 3 Mal: Kein | beliebig oft, gefolgt von einem |
. Ein beliebiges Zeichen
(.{2}) Als Rückgabewert 2 beliebige Zeichen
 

DerD

Grünschnabel
Mit:
Code:
1.^(?:[^\|]*\|){3}.(.{2})
bekomme ich den kompletten Teilstring, ich möchte aber nur die letzten 2 Zeichen. Geht das?
 

Yaslaw

n/a
Moderator
Ich weiss nicht, in welcher Sprache du den RegExp brauchst.
Aber normalerweise geht das so, dass man ein komplexen Pattern hat. Mit diesem Findet er ALLES was im Pattern beinhaltet ist. Mit () kann man SubMatches/Groups, oder wie sie auch immer heissen, extrahieren.
Siehe mein Beispiel in VBA. Dort wird ii extrahiert, da wir die Klammer (.{2}) haben.
Auch im regex101.com Beispiel, das ich aufgesetzt habe, findet er als erstes SubMatch ii.
Wie das jetzt in deiner Programmiersprache aussieht, weiss ich nicht. Ich weiss nicht welche Sprache und welchen Befehl du verwendest. Aber ich bin mir Sicher, du kommt auch irgendwie auf die SubMatches.

Ein Tipp: Lies mal die ganze Doku zu deinem RegEx Befehl durch. Dir scheinen da noch einige Löcher im Wissen vorhanden zu sein.

2017-07-04_084106.png
 

Neue Beiträge