hilfdirselbst.ch
Facebook Twitter gamper-media
Ferestes p
Beiträge: 21
9. Nov 2017, 20:04
Beitrag #1 von 5
Bewertung:
(397 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

RegExp – Probleme mit match()/exec()


Hallo Forum,

ich habe ein Problem mit match()/exec(). Hintergrund ist, dass ein wirklich sehr komplexer regulärer Ausdruck zusammengesetzt wird und dann ein String damit gematcht werden soll. Allerdings hängt sich InDesign (CS6, CC 2015) dabei auf.
Code
//eventuelle Namenspräfixe 
var _npfx = "(?:[vV]on ?|[vV]on ?der ?|[vV]an ?|[vV]an ?den ?|[vV]an ?der ?)";
//Groß- und Kleinbuchstaben
var _upperCase ="["0041", "0042"]"; // und so weiter
var _lowerCase ="["0061", "0062"]"; // und so weiter
//Namen
var _surnames = "_upperCase + _lowerCase + "+"";
//regulärer Ausdruck wird kompiliert
var _refName2Grep2 = RegExp ("[au]nd +((?:" +_npfx + ")?" + _surnames + ") ,\\d{4}");
//und auf _someSting angewendet.
var _refName2 = _someString.contents.exec(_refName2Grep2);


Der Code ist vereinfacht, aber vielleicht wird das Problem klar. Ist das bekannt? Wie könnte man sonst sehr komplexe reguläre Ausdrücke auf String anwenden?

Vielen Dank!
Top
 
X
pixxxelschubser p
Beiträge: 1508
10. Nov 2017, 00:02
Beitrag #2 von 5
Beitrag ID: #560611
Bewertung:
(367 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

RegExp – Probleme mit match()/exec()


Hmmh?

Was genau möchtest du finden?
Was soll mit den Fundstellen passieren?
Warum zerpflückst du den Suchstring in so viele Einzelteile?

Kannst du dein Vorhaben noch etwas genauer beschreiben und ein paar (möglichst mehr als zwei) aussagekräftige Beispiele zeigen? Oder eine IDML auf einen Hoster deiner Wahl hochladen und hier verlinken?

Warum verwendest kaum Platzhalter?
Du bist dir bewusst, dass dein Grep einige falsch positive Treffer landet?

Sieh dir bitte mal den Anhang an.
Möchtest du das finden? Ist im Grunde genommen fast dein Grep, lediglich etwas zusammengesetzt und einmal ohne (magenta) und einmal mit Wortgrenzenbeschränkung (blau, das verhindert schon ein paar falsch positive Treffer)

Der Screenshot zeigt zumindest das, was ich denke, aus deinem Eingangspost herausgelesen zu haben. Ich könnte aber auch total danebenliegen - sind halt zu wenige Informationen.

viele Grüße
pixxxelschubser




Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean.

Isaac Newton


als Antwort auf: [#560608] Top

Anhang:
 
Ferestes p
Beiträge: 21
10. Nov 2017, 09:50
Beitrag #3 von 5
Beitrag ID: #560622
Bewertung:
(331 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

RegExp – Probleme mit match()/exec()


Hallo pixxxelschubser,

danke erst einmal für die Antwort. Der reguläre Ausdruck ist so zerpflückt, weil ich zwischenzeitlich dachte, dass match() Probleme mit zu verschachtelten Ausdrücken bekommt.

Der ursprüngliche Ausdruck sieht so aus:

Code
 "(?:(?:[vV]on(?:" + _space + "der)?|[vV]an(?:" + _space + "de[nr])?|[vV]an" + _apos + "t|ter|[dD]i|[dD]e(?:" + _space + "la)?)" + _space + "+|[dD](?:" + _apos + "|e)|Ma?c|O" + _apos + "|El" + _space + ")"; //Namenspräfixe 


wobei _space wiederum verschiedene Leerräume abdeckt und _apos verschiedene Apostrophen findet.

Du hast ja mit Grep gesucht, bei match()/exec() stehen ja leider keine POSIX-Ausdrücke zur Verfügung, ebenso funktionieren \u und \l für uppercase und lowercase nicht, daher die Unicodepoints (allerdings macht das den Grep-Ausdruck leider absolut unlesbar).

Die Wortgrenzen sind in dem Fall nicht nötig. In einem ersten Schritt suche ich mit Grep im FLießtext nach Referenzen auf Literatur und speichere die Treffer in einem Array. Anschließend werte ich jeden Treffer aus, um zu prüfen, ob nur ein Autor (Autor, Jahreszahl), zwei Autoren (Autor and Autor, Jahreszahl) oder mehrere Autoren (Autor et al., Jahreszahl) gefunden wurden. Da ich hier jeweils einen String auswerten muss, muss ich mit match() oder exec() arbeiten.
als Antwort auf: [#560611]
(Dieser Beitrag wurde von Ferestes am 10. Nov 2017, 09:51 geändert)
Top
 
pixxxelschubser p
Beiträge: 1508
10. Nov 2017, 18:21
Beitrag #4 von 5
Beitrag ID: #560641
Bewertung:
(295 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

RegExp – Probleme mit match()/exec()


Jetzt hast du mich verwirrt!
Oder hast du die Grep bzw. Regex im Screenshot eventuell übersehen?
Und leider geht dein Antwort ein bisschen an meinen Nachfragen „vorbei“.

Ich verwende weder \u noch \l und auch keine POSIX-Ausdrücke.

Ansonsten habe ich lediglich die Buchstaben in einer Klasse gesammelt und nicht wie du die „langatmigen Unicodepoints für jeden einzelnen Buchstaben“. Und die einzelnen Teil-Suchen zusammengefügt. Die zusätzlichen Wortgrenzen sind nicht zwingend nötig, helfen aber einige falsch positive Treffer zu verhindern.

Deshalb sollten beide Regex auch in Verbindung mit exec() funktionieren. Höchstens der Ausdruck für „Gross- und Kleinschreibung ignorieren“ könnte u.U. im Skript nicht funzen. Das habe ich noch nie ausgetestet. Aber dafür gibt es ja für Regex in Javascript den Parameter match(/regex/i)

Oder vielleicht hapert es an dem bereits bei dir enthaltenen Ausdruck „nicht im Suchstring speichern“ (habe ich ebenfalls noch nie in einem Skript verwendet).

Aber vielleicht gehst du ja noch etwas genauer auf die anderen Fragen in meinem vorherigen Posting ein.

viele Grüße
pixxxelschubser




Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean.

Isaac Newton


als Antwort auf: [#560622] Top
 
Ferestes p
Beiträge: 21
13. Nov 2017, 18:30
Beitrag #5 von 5
Beitrag ID: #560676
Bewertung:
(203 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

RegExp – Probleme mit match()/exec()


Danke, du hast Recht. Das Zusammenfassen zu einer Klasse hat das Problem gelöst. Davor war mein Prozessor wohl überfordert. Merci!
als Antwort auf: [#560641] Top
 
X