Archiv verlassen und diese Seite im Standarddesign anzeigen : RegEx - kennt sich jemand damit aus?
Platos
2023-08-31, 16:19:37
Ich nutze gerade Obsidian und darin nutze ich das Plugin, um Anki mit Obsidian zu verbinden (für die, die nicht wissen was das ist: Mit Anki kann man Karteikarten erstellen)
Jetzt ist es so, die normale Syntax, wie man die Karteikarten erstellt (in obisidian) ist nicht so, wie ich es möchte. Jetzt gibt es aber die möglichkeit, sich seine eigene Syntax zu schreiben. Ich kenne mich da quasi 0 aus. Hier die Seite:
https://github.com/Pseudonium/Obsidian_to_Anki/wiki/Regex
Es gibt (wie man da sieht) schon vorgefertigte Custom-Syntax. Die, die mir am meisten zusagt ist diese: https://github.com/Pseudonium/Obsidian_to_Anki/wiki/Question-answer-style
Und die Regex line dafür: ^Q: ((?:.+\n)*)\n*A: (.+(?:\n(?:^.{1,3}$|^.{4}(?<!<!--).*))*)
Mit dieser Syntax muss ich die Frage und Antwort (Vorder- und Rückseite der Karteikarte) so machen:
Q: Das ist meine Frage
A: Meine Antwort.
Problem hier ist, dass folgendes nicht funktioniert:
Q: Meine Frage
zusätzlicher Text
A: Meine Antwort.
Denn dann wird es nicht mehr erkannt von der Syntax her. Es dürfen leere Zeilen vorkommen, aber es darf nichts dazwischen sein. Ich suche eine Syntax, die möglichst nahtlos in Texte eingefügt werden kann. Also beispielsweise so (ohne die Anführungszeichen):
"Was für eine Fellfarbe haben Erbsen ?
Das ist abhängig von den Genen, aber grundsätzlich ist es üblicherweise Grün, jedoch gibt es auch gelbe."
Das Fette soll nun Frage und Antwort sein, also eben verschmolzen im Text. Der Rest des Textes soll nun nicht in der Karteikarte erscheinen und vor allem soll es die Syntax nicht kaputt machen, also es soll immer noch als Karteikarte erkannt werden. Ich weiss, dass das so ohne zusätzliche Zeichen nicht einfach möglich ist. Aber ich stelle mir das dann eben (z.B) so vor:
"Q: Was für eine Fellfarbe haben Erbsen ? ---
Das ist abhängig von den Genen, aber A: grundsätzlich ist es üblicherweise Grün ---, jedoch gibt es auch gelbe."
Diese Version würde den Anfang und das Ende von Frage und Antwort definieren. Das brauche ich, um dazwischen zusätzlichen Text zu haben.
Wobei das mit den 3 Strichen "---" nur ein Beispiel ist. Es soll im Text aber möglichst unauffällig sein. Also sowas wie /END geht gar nicht :D Aber wenn jemand eine unauffälligere Zeichenfolge hat, immer her damit. Natürlich darf man sie nicht misinterpretieren können.
Monger
2023-08-31, 16:58:07
Nur damit ich deine Struktur richtig verstehe: erst kommt ne Zeile die mit Q: präfixed ist, dann Leerzeile, dann ne beliebige Anzahl an Zeilen, dann A: irgendwas?
Weil in deinen Beispielen steht nix mehr von A:
Platos
2023-08-31, 17:04:38
Ja, also:
A: Fragezeile
Fragezeile
Fragezeile
Hidden Text
Hidden Text
Hidden Text
B: Antwortzeile
Antwortzeile
Antwortzeile
Wobei am liebsten wäre es mir, wenn ich nicht auf Leerzeilen angewiesen bin.
Also das wäre mir am liebsten:
A: Fragetext Fragetext Fragetext --- Hidden Text Hidden Text Hidden Text B: Antworttext Antworttext Antworttext ---
Wobei "---" jeweils das Ende der Frage bzw. Antwort kennzeichnet.
Also so wie hier: "Q: Was für eine Fellfarbe haben Erbsen ? ---
Das ist abhängig von den Genen, aber A: grundsätzlich ist es üblicherweise Grün ---, jedoch gibt es auch gelbe."
Also die Antwort bzw. Frage kann (muss aber nicht) auf der selben Zeile sein.
Aber ich weiss halt nicht, ob das möglich ist.
Edit: Aber in meinen Beispielen steht doch immer auch "A:" ? Also bei mir wird es angezeigt.
Monger
2023-08-31, 17:39:51
Ich antworte heute nacht nochmal ausführlicher, aber: eine harte Lektion die man mit Regex lernt, ist dass greedy Operatoren zwar superpraktisch sind, dich aber bei komplexeren Strukturen schnell umbringen. Und dass es dann einfacher ist, über Negationen zu arbeiten.
Also sinngemäß:
A: (eine Folge von nicht Drei Bindestrichen)(drei Bindestriche)(eine Folge von nicht drei Bindestrichen)(drei Bindestriche)B: (eine Folge von nicht drei Bindestrichen)
PatkIllA
2023-08-31, 17:42:57
Sowas? \*\*([^\*]*)\*\*(?:.+)\*\*([^\*]*)\*\*
Dann kommt bei **Frage?**Hier ist sinnloser Test und hier die **Antwort** und noch etwas text
Hier kann man das gut ausprobieren und bekommt das auch erklärt.
https://regex101.com
Wenn es mit —- geht: groups
(Q:)(.*)(---)(.*)(A:)(.*)(---)(.*)
Habe ich mal aus deinem Text rausgeschrieben. Mulitline sollte an sein. Dann siehst welche Gruppen passen. Entweder machst du noch ein Whitespace postprocessing, oder tweakst die regex
generell in regex101.com üben
Sowas? \*\*([^\*]*)\*\*(?:.+)\*\*([^\*]*)\*\*
Dann kommt bei **Frage?**Hier ist sinnloser Test und hier die **Antwort** und noch etwas text
Hier kann man das gut ausprobieren und bekommt das auch erklärt.
https://regex101.com
Sieht auch gut aus.
Platos
2023-08-31, 18:05:18
Sorry für meine Unfähigkeit ^^ Ich habe quasi keine Ahnung, was von dem Code für was steht.
Aber danke für alle eure Hilfe!
Sowas? \*\*([^\*]*)\*\*(?:.+)\*\*([^\*]*)\*\*
Dann kommt bei **Frage?**Hier ist sinnloser Test und hier die **Antwort** und noch etwas text
Hier kann man das gut ausprobieren und bekommt das auch erklärt.
https://regex101.com
Wie kann ich das denn dort testen? Also wenn ich bei Test String dein Text eingebe und oben den Code, wie kann ich erkennen, ob es funktioniert? (Edit: Ah, ich darf keine Leerzeilen bei Regular Expression haben. Jetzt gehts)
Blöderweise bewirkt **A** in Obsidian, dass etwas Fett geschrieben wird.
Es hat so viele Sternchen... Ich verstehe nicht, welche ich ersetzen muss, um es durch ein anderes Zeichen zu ersetzen. Beispielsweise --- (drei Striche) oder z.B drei °°° oder sowas.
Wenn es mit —- geht: groups
(Q:)(.*)(—-)(.*)(A:)(.*)(—-)(.*)
Habe ich mal aus deinem Text rausgeschrieben. Mulitline sollte an sein. Dann siehst welche Gruppen passen. Entweder machst du noch ein Whitespace postprocessing, oder tweakst die regex
generell in regex101.com üben
Also das funktioniert ebenfalls mit Q: und A: für die Frage?
Und zum Kennzeichnen des Ende der Frage nehme ich das da: —-
Wie mache ich diesen langen Strich auf der Tastatur ?
In Obsidian funktioniert es aber leider nicht, wenn ich folgenden Text schreibe:
TARGET DECK: obsidian-test3
Q: testfrage?
weitere fragezeile 1
weitere fragezeile 2—-
zwischentext
A: Testantwort
weitere zeile1
weitere zeile2—-
text danach
Könntest du mir für den Test String ein kleines Beispiel schreiben wie PatKilla ?
(TARGET DECK: ist zum erstellen eines Decks und nicht einer Karteikarte)
Monger
2023-08-31, 19:43:00
Meine Lösung wäre jetzt gewesen:
Q:[^-]+---[^-]+A:[^-]+---[^-]+
Wenn du bestimmte Gruppen capturen willst, musst du halt noch entsprechend klammern. Wenn du in den jeweiligen Blöcken einfache Bindestriche erlauben willst, musst du mit Lookahead arbeiten. Da hab ich aber grad n Brett vorm Kopf.
Edit:
Mit Bindestrichen im Text
Q:(.(?!---))+[^-]---\s\s(.(?!---))+[^-]---(.(?!---))+
matcht
Q: Was für eine Fellfarbe haben Erbsen ? ---
Das ist abhängig von den Genen, aber A: grundsätzlich - ist es üblicherweise Grün ---, jedoch gibt es auch gelbe.
Ich versteh aber nicht, warum der Punkt keinen Zeilenumbruch captured. Ist das vielleicht ne Spezialität von regex101? Weil dann könnte man die blöden \s\s auch weglassen.
Platos
2023-08-31, 20:08:50
Also bei regex101.com funktioniert das nicht, wenn ich
Q: meine Frage
A: Meine Antwort
eingebe.
Aber es müssen keine Bindestriche sein. Von mir aus °°° (das sind grad celcius zeichen)
PatkIllA
2023-08-31, 20:29:33
Ich versteh aber nicht, warum der Punkt keinen Zeilenumbruch captured. Ist das vielleicht ne Spezialität von regex101? Weil dann könnte man die blöden \s\s auch weglassen.
Das ist das single line flag. Hängt wohl von der Implementierung ab wie sich das standardmäßig verhält.
Platos
2023-08-31, 20:41:25
Das ist das single line flag. Hängt wohl von der Implementierung ab wie sich das standardmäßig verhält.
Was wäre denn richtig, wenn es auch mehrere Linien betreffen soll ?
Monger
2023-08-31, 20:52:47
Was wäre denn richtig, wenn es auch mehrere Linien betreffen soll ?
Kommt auf die Regex Implementierung an. In dot net kann man der Regex Klasse das Multiline Flag mitteilen. In JS und python gibts meines Wissens ein Sprachfeature dafür.
Ja, auch Regex kennt Dialekte. Gibt subtile Unterschiede.
Kommt auf die Regex Implementierung an. In dot net kann man der Regex Klasse das Multiline Flag mitteilen. In JS und python gibts meines Wissens ein Sprachfeature dafür.
Ja, auch Regex kennt Dialekte. Gibt subtile Unterschiede.
ts oder py ist das im repo dort.
Wie vom TS mit A und B
https://i.ibb.co/tXwCyY3/Screenshot-2023-08-31-211613.png (https://ibb.co/HdLgmGX)
oder mit newlines
https://i.ibb.co/9rm7vh6/Screenshot-2023-08-31-212325.png (https://ibb.co/4VwHf2z)
Platos
2023-08-31, 21:30:45
ts oder py ist das im repo dort.
Wie vom TS mit A und B
https://i.ibb.co/tXwCyY3/Screenshot-2023-08-31-211613.png (https://ibb.co/HdLgmGX)
Cool, genau das suche ich.
Edit2: https://regex101.com/r/orOkOF/1
Denkt ihr, es ist möglich, sowas hinzukriegen ? Also dass es keine Rolle spielt, ob der Text (Frage, Antwort, hidden Text) jetzt auf der selben Linie steht oder nach einer Leerzeile? Also dass sowohl auf der selben Linie, als auch auf einer nächsten Geht?
Also so wie im 2. regex101 link.
Ich probiere inzwischen mal das aus Post 14 aus in Obsidian.
Edit: Teile Weggelöscht. Sauber in Post 17 dargestellt.
Platos
2023-08-31, 22:47:59
Ich mache mal ein neuen Post, damit das übersichtlicher wird:
So sieht es jetzt aus (siehe Bild unten).
Also wie man im rechten Fenster sieht, ist "A:" meine Frage und "Meine Frage" ist meine Antwort. Links im Fenster sieht man, was ich als Syntax verwendet habe.
Das habe ich als RegEx verwendet (direkt aus den Einstellungen kopiert, damit ich keine Abschreibfehler mache):
(A:)(.*)(°°°)(.*)(B:)(.*)(°°°)(.*)
Ich habe °°° anstatt --- genommen, weil glaube ich die 3 Striche auch schon vergeben sind. Es geht aber sowieso erst nach mehreren Malen Synchroisieren.
Aber hat jemand eine Idee, warum es das in Obsidian immer falsch erkennt?
Edit: Und bei regex101 wird genau das selbe erkannt: https://regex101.com/r/pUY3H4/1
Edit2: Das steht so auf dieser Seite (siehe auch 1. Post): https://github.com/Pseudonium/Obsidian_to_Anki/wiki/Regex
The above styles are but a few examples of the endless possible styles you can make using regular expressions. If you want to make your own style, however, you should know these things:
The script automatically compiles the regular expression with a 'multiline' flag, so you can use the ^ character to signal the beginning of a line
You need to have as many capture groups in your regexp as there are fields in the note type - the 1st capture group becomes the 1st field, the 2nd becomes the 2nd field etc
If making a 'paragraph' regex, consider using this group to match lines at the end - (?:^.{1,3}$|^.{4}(?<!<!--).*)). It ensures that you don't accidentally match the <!-- at the start of an ID comment!
Ist das also gar nicht möglich?
Monger
2023-08-31, 23:53:27
Du kannst non-capturing groups verwenden, wenn du was gruppieren aber nicht speichern willst, also z.B.
(?:°°°)
Platos
2023-09-01, 10:30:56
Das geht bei rege101: https://regex101.com/r/j9gYA2/1
Aber leider geht es nicht bei Obsidian. Es wird aus irgend einem Grund keine Karteikarte erstellt.
Möglicherweise liegt es ja daran:
If making a 'paragraph' regex, consider using this group to match lines at the end - (?:^.{1,3}$|^.{4}(?<!<!--).*)). It ensures that you don't accidentally match the <!-- at the start of an ID comment!
Wenn die ID nicht erstellt werden kann, wird das vlt. dann der Grund sein, warum es nicht geht.
Das Problem: Ich verstehe dieses RegEx nicht. Nachdem ich ein Turtorial geschaut habe, verstehe ich gar nichts. Denn das ist deutlich komplizierter.
Du kannst non-capturing groups verwenden, wenn du was gruppieren aber nicht speichern willst, also z.B.
(?:°°°)
Also oben im Zitat von meinem Post steht ja, ich darf nur so viele Capture groups haben, wie ich dann eben Felder auf meiner Karteikarte habe (also darf ich nur 2 haben. Die Karteikarte hat ja nur 2 Seiten).
Zählt denn eine non-capturing group noch dazu?
Ich glaube, der Grund, warum die ganzen Codes ( die bei regex101 funktionieren) in Obsidian nicht funktionieren, sind diese Bedinungen, die ich oben zitiert habe.
Das geht bei rege101: https://regex101.com/r/j9gYA2/1
Aber leider geht es nicht bei Obsidian. Es wird aus irgend einem Grund keine Karteikarte erstellt.
Möglicherweise liegt es ja daran:
Wenn die ID nicht erstellt werden kann, wird das vlt. dann der Grund sein, warum es nicht geht.
Das Problem: Ich verstehe dieses RegEx nicht. Nachdem ich ein Turtorial geschaut habe, verstehe ich gar nichts. Denn das ist deutlich komplizierter.
Also oben im Zitat von meinem Post steht ja, ich darf nur so viele Capture groups haben, wie ich dann eben Felder auf meiner Karteikarte habe (also darf ich nur 2 haben. Die Karteikarte hat ja nur 2 Seiten).
Zählt denn eine non-capturing group noch dazu?
Ich glaube, der Grund, warum die ganzen Codes ( die bei regex101 funktionieren) in Obsidian nicht funktionieren, sind diese Bedinungen, die ich oben zitiert habe.
Wenn du auf regex101 schaust, dann hat der link von dir 6 Gruppen. Es braucht ja 4?
(A:)(.*)(?:°°°) (?:.*)(B:)(.*)(?:°°°) (?:.*)
Platos
2023-09-01, 11:20:37
Ja also warum braucht es 4?
Das von dir aus Post 14 hat bei regex101 ja auch 8 gruppen ?
https://regex101.com/r/6NbNBX/1
Monger
2023-09-01, 11:42:55
Zählt denn eine non-capturing group noch dazu?
Nein, ne non-capturing group wird nicht gecaptured, deshalb heißt sie ja so ^^
Ja also warum braucht es 4?
Das von dir aus Post 14 hat bei regex101 ja auch 8 gruppen ?
https://regex101.com/r/6NbNBX/1
Ich glaube da hatte ich noch nicht verstanden was dein Zielframework alles braucht.
Platos
2023-09-01, 13:59:32
Wenn ich mir die RegEx mal so anschaue, die vorgegeben sind, dann sieht man, dass alle Fragen und Antworten mit ?: anfangen. Also d.h die non-capturing groups sind glaube ich dann der Inhalt der Antwort und Frage.
Aber ich bin mir nicht sicher. Habe jetzt ne Ewigkeit rumprobiert und bin zu nichts gekommen. Ich glaube, das ist nicht möglich in Obsidian mit diesem Plugin.
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.