hilfdirselbst.ch
Facebook Twitter gamper-media
Gaby Leuenberger p
Beiträge: 29
2. Nov 2017, 16:23
Beitrag #1 von 10
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Hallo zusammen

Ich versuche in einem Skript mit
Code
app.findGrepPreferences.findWhat = '(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))'; //Tausendertrenner 
app.changeGrepPreferences.changeTo = '$0~<'; // Ersetzungsanweisung

zu ersetzen.

Das funktioniert in der GREP-Suchmaske in InDesign, aber leider nicht, wenn ich das per Skript auslösen will.

Weiss jemand wieso?

Merci für Denkanstösse!
Gruss
Gaby
Gaby Leuenberger Top
 
X
Hans Haesler  M  p
Beiträge: 5588
2. Nov 2017, 17:38
Beitrag #2 von 10
Beitrag ID: #560317
Bewertung:
(1688 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Hallo Gaby,

wie sieht Dein Testdokument aus?

Mit den Suchen/Ersetzen-Mustern funktioniert es hier weder per Dialog noch mit einem Script.

Doch wenn ich den Lookahead zu Beginn rausnehme, klappt es mit beiden Methoden:

Code
app.findGrepPreferences.findWhat = "([0-9])(?=(?:[0-9]{3})+(?![0-9]))"; // Tausendertrenner  
app.changeGrepPreferences.changeTo = "$0~<"; // Ersetzungsanweisung

app.documents[0].changeGrep();

In der Textkette "test 1234567 test" werden zwei Tausendertrenner eingefügt.

Gruss, Hans
als Antwort auf: [#560315] Top
 
Kai Rübsamen  M  p
Beiträge: 4524
2. Nov 2017, 18:11
Beitrag #3 von 10
Beitrag ID: #560319
Bewertung:
(1683 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Hallo!

In einer GREP-Welt außerhalb von InDesign ist es je nach Library auch möglich, an gefundenen Positionen etwas einzufügen. In InDesign braucht es aber mind. 1 Zeichen.

Verhalten CS6: Weder "Ändern" noch "Alle ändern" ersetzt etwas
Verhalten CC2017: "Ändern" ersetzt, "Alle ändern" ersetzt nichts

Das Verhalten von CC2017 macht für mich keinen Sinn u. ich rate, dass die Skriptingengine nach wie vor ein Zeichen braucht.

Dein längerer GREP liese sich demnach besser so schreiben:
(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))
(?<=\d)(?=(\d{3})+(?!\d))
(?<=\d)(?=(\d{3})+\b)
\d(?=(\d{3})+\b)

und per Skript dann so:
\\d(?=(\\d{3})+\\b)
Gruß Kai Rübsamen
_______________________
als Antwort auf: [#560317] Top
 
Gaby Leuenberger p
Beiträge: 29
6. Nov 2017, 09:27
Beitrag #4 von 10
Beitrag ID: #560387
Bewertung:
(1568 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Guten Morgen ihr Lieben!

Verzeiht meine späte Antwort, ich war am Freitag nicht mehr bei der Arbeit.

Habt vielen Dank für eure Rückmeldungen, vor allem, dass in CC 2017 alle ändern und einzeln ändern nicht gleich funktioniert, erklärt dann doch einiges. Die Problematik der vielen regex-Flavors kenne ich, habe aber noch immer nicht genau herausgefunden, zu welchem die ID-Engine eigentlich passt. Vielleicht weisst du das, Kai?

Mein eigentlicher GREP ist ursprünglich wesentlich komplexer und löste das anders, es ging mir hier nur um die Problematik der Ersetzung, die ja Kai erklärt hat.

Was ich tatsächlich alles zusätzlich abfangen sollte, ist Folgendes:
- Tausendertrenner mit Apostroph oder Leerschlag zu Achtelgeviert (Apostroph ist schmerzfrei, der Leerschlag macht Ärger, siehe unten)
- Kein Tausendertrenner für vierstellige Zahlen (Ausschliessen geht schlecht, im Moment versuch ich, das hinterher zu korrigieren)
- Kein Tausendertrenner in ISBN-Nummer, die fünf Stellen haben (das geht mit negativem Lookaround für Divis vor und nach dem Match)
- Zahlen mit Nachkommastellen matchen, aber dort keine Tausendertrenner einfügen (geht auch mit einem lookaround)
-

Der GREP mit den Wortgrenzen reicht mir so also nicht. Mein allergrösstes Problem bleiben aber Zeitschriften-Verweise, die mit "Jahr Seitenzahl" zitieren; weil die i.d.R. durchs Jahr durchpaginieren, hat es da oft dreistellige Seitenzahlen, was mir natürlich zusammen mit dem Jahr alles zerschiesst. Ein Lookbehind mit den Zeitschriftenabkürzungen funktioniert nicht (es sind viele, und die Abkürzungen sind unterschiedlich lang).

Bis auf die Zeitschriften mit dreistelligen Seitenzahlen funktioniert das hier eigentlich gut (Regex-Baum wollte ich anhängen, aber es geht nicht):

Code
app.findGrepPreferences = NothingEnum.nothing;  
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '((?<!-)\\d\\d(\\p{Z*}|\')?(?=((?:\\d\\d\\d(?:\\p{Z*}|\')?)+)(?!\\d))(?<!\\d,\\d\\d|\\d\\.\\d\\d)|\\d(\\p{Z*}|\')?(?=(\\d\\d\\d(\\p{Z*}|\')?){2,}(?!\\d))(?<!\\d,\\d\\d|\\d\\.\\d\\d))';
// Match fünf
app.changeGrepPreferences.changeTo = '$1~<'; // Ersetzungsanweisung
var _ziff1 = app.activeDocument.changeGrep();
$.bp();
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '(\\d)(?:\'|\\p{Z*})(\\p{Z*}\\d)'; // Tausenderabstand, Korrektur der Fehler
app.changeGrepPreferences.changeTo = '$1$2'; // Ersetzungsanweisung
var _ziff1a = app.activeDocument.changeGrep();

app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '(?<!\\d)(\\d){1}(?:\'|\\p{Z*})(\\d{3})(?!(,|\\p{Z*})?\\d)'; // Tausenderabstand, Korrektur vierstellige
app.changeGrepPreferences.changeTo = '$1$2'; // Ersetzungsanweisung
var _ziff1b = app.activeDocument.changeGrep();

app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;


Ich werde wohl oder übel noch was austüfteln müssen, um die Zeitschriften-Abkürzungen zu matchen und dann die Jahreszahlen zu korrigiern, es sei denn, von euch hat noch wer eine zündende Idee...

Liebe Grüsse
Gaby Leuenberger
als Antwort auf: [#560319] Top
 
Jabadabadu p
Beiträge: 218
6. Nov 2017, 10:06
Beitrag #5 von 10
Beitrag ID: #560391
Bewertung:
(1559 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Moin,

nur eine "kurze" Bemerkung: die Einbindung von GREP zur Gliederung von ISBN würde ich nicht vornehmen; denn es gibt 2- bis 6-stellige Verlagskennziffern (im deutschsprachigen Raum alles nach 978-3-), die abhängig von dieser Ziffernfolge dann dementsprechend reduzierte Buchnummern und die Prüfziffer besitzen, um schließlich eine 13-stellige Ziffernfolge zu besitzen. GREP alleine kann nicht entscheiden, ob das jetzt ein Verlag mit großer Titelausschüttung (kleine Verlagskennzahl, hohe Buchnummerierung) oder ein Kleinverlag mit höchstens 100 möglichen Nennungen ist. Einzig die Prüfziffer ist lösbar von der Zahlenfolge, eventuell noch die ersten drei Ziffern, wenn es sich um ISBN-13 handelt.
Viele Grüße

Jörn aka Jabadabadu

———————————————————————————————
Dr. Jörn Kobes @ www.computus-druck.com
Win 8/Win 10 — Creative Suite 2, 4, 5.5, 6, CC 2015.4, CC 2017
———————————————————————————————
als Antwort auf: [#560387] Top
 
Gaby Leuenberger p
Beiträge: 29
6. Nov 2017, 10:10
Beitrag #6 von 10
Beitrag ID: #560392
Bewertung:
(1556 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Moinmoin Jörn

Danke für den Hinweis, aber das tue ich auch nicht. Mir geht es bei diesem GREP nur darum, eben bei fünf- oder sechstelligen ISBN-Gruppen NICHT ein Achtelgeviert reinzumachen :)

Es gibt aber sehr zuverlässige GREPs, um ISBN-10 oder -13 zu erkennen und auszulesen, falls du das je benötigen solltest.

Schöne Grüsse
Gaby
Gaby Leuenberger
als Antwort auf: [#560391] Top
 
Kai Rübsamen  M  p
Beiträge: 4524
6. Nov 2017, 10:41
Beitrag #7 von 10
Beitrag ID: #560396
Bewertung:
(1549 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Hallo Gaby,

Antwort auf: Die Problematik der vielen regex-Flavors kenne ich, habe aber noch immer nicht genau herausgefunden, zu welchem die ID-Engine eigentlich passt. Vielleicht weisst du das, Kai?

Das ist die Perl-Bibliothek mit leichten Veränderungen.

Ansonsten: Du solltest zumindest für das Forum deinen GREP kürzer schreiben und viell. eine idml zum testen mitliefern. Lange GREPs lesen und noch ein Beispiel selber bauen, mag hier keiner ;-)
Gruß Kai Rübsamen
_______________________
als Antwort auf: [#560392] Top
 
Gaby Leuenberger p
Beiträge: 29
6. Nov 2017, 10:55
Beitrag #8 von 10
Beitrag ID: #560398
Bewertung:
(1545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Hallo Kai

Danke für den Hinweis und bitte entschuldige, ich wollte den Regex-Baum des Regex-Buddy mitschicken, aber Dateien anhängen können nur Member :-( (oder ich bin zu blöd dafür, ich kann hochladen, aber nirgends speichern); insofern geht auch eine .idml-Datei wohl nicht.

Aber hier ein Beispiel, wogegen ich teste, halt als Code eingefügt:

Code
ISBN 978-3-7272-8180-8  
ISBN 978-3-03751-914-1
70909874594950394
etwa 5 000 000 CHF
Aber 1 000 000,95 EUR
1000 CHF
3.14276
ARV 2017 423 ff.;
SJZ 2003 77,
GesKR 1988 5 f.
125000
32'855
12. Oktober 2017
1.000
22.01.2015


"Etwa" und "aber" vor den Zahlen habe ich jetzt eingefügt, um meinen Korrektur-GREP für Zeitschriftenjahrgänge zu testen, aber hier fehlt noch ein Puzzlestück:
Code
(([\u\l]{1,5}\s))(?<!\d)(?:(\d)\s(\d{3}))(?=(\s\d{3}){1}(?!(CHF|EUR|Fr\.)) 


macht auch die Euro-Beträge mit Cent. Ich muss noch schauen, wo der negative Lookahead genau hin soll, dass es funktionert.

Merci und Gruss
Gaby
Gaby Leuenberger
als Antwort auf: [#560396] Top
 
Hans Haesler  M  p
Beiträge: 5588
6. Nov 2017, 11:57
Beitrag #9 von 10
Beitrag ID: #560409
Bewertung:
(1533 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Hallo Gaby,

Zitat (...) aber Dateien anhängen können nur Member :-(

Dieses Problem kann gelöst werden :-): http://www.hilfdirselbst.org/...amp;read_category=31

Gruss, Hans
als Antwort auf: [#560398] Top
 
Gaby Leuenberger p
Beiträge: 29
6. Nov 2017, 13:43
Beitrag #10 von 10
Beitrag ID: #560421
Bewertung:
(1518 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen/ersetzen mit Grep per Skript


Schon klar Hans, schon klar :-)

Inzwischen hab ich übrigens auch noch die Lösung für die Zeitschriftenjahrgänge, falls für die sonst noch jemand Verwendung findet, hier im ganzen Tausendertrenner-Korrekturpaket:
Code
app.findGrepPreferences = NothingEnum.nothing;  
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '((?<!-)\\d\\d(?:\\p{Z*}|\')?(?=((?:\\d\\d\\d(?!-)(?:\\p{Z*}|\')?)+)(?!\\d))(?<!\\d,\\d\\d|\\d\\.\\d\\d)|(?<!-)\\d(?:\\p{Z*}|\')?(?=(?:\\d\\d\\d(?!-)(?:\\p{Z*}|\')?){2,}(?!\\d))(?<!\\d,\\d\\d|\\d\\.\\d\\d))';
// Matcht ab fünfstelligen oder grösseren Zahlen die Tausenderziffer [mit und ohne Kommastellen, mit und ohne (falsche) Tausendertrenner]
app.changeGrepPreferences.changeTo = '$1~<'; // fügt ein Achtelgeviert ein nach der Tausenderziffer
var _ziff1 = app.activeDocument.changeGrep();

app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '(\\d)(?:\'|\\p{Z*})(\\p{Z*}\\d)'; // Tausenderabstand, Korrektur der Fehler
app.changeGrepPreferences.changeTo = '$1$2'; // Ersetzungsanweisung
var _ziff1a = app.activeDocument.changeGrep();

app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '(?<!\\d)(\\d){1}(?:\'|\\p{Z*})(\\d{3})(?!(,|\\p{Z*})?\\d)'; // Tausenderabstand, Korrektur vierstellige
app.changeGrepPreferences.changeTo = '$1$2'; // Ersetzungsanweisung
var _ziff1b = app.activeDocument.changeGrep();


app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '((?:[a-zA-Z]{1,5}\\p{Z*}))(?<!\\d)(?:(\\d)\\p{Z*}(\\d{3}))(?=(?:\\p{Z*}\\d{3})(?!(?:,\\d\\d)?\\p{Z*}?(?:CHF|EUR|Fr\\.|\\$|€)))'// Korrektur Zeitschriftenjahrgang
app.changeGrepPreferences.changeTo = '$1$2$3'; // Ersetzungsanweisung; ZS, Jahr ohn Tausenderabstand
var _ziff1c = app.activeDocument.changeGrep();


app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '(\\d{4})\\p{Z*}(\\d{3})'// Korrektur Zeitschriftenseite
app.changeGrepPreferences.changeTo = '$1 $2'; // Ersetzungsanweisung, LS statt Achtelgeviert
var _ziff1d = app.activeDocument.changeGrep();


app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;


Danke Kai für den wertvollen Input zur Regex-Engine. Das war hilfreich, um mich von der anderen Lösungsvariante zu befreien und hierzu zurückzukehren. Ich hoffe, die falsch positiven haben sich jetzt erledigt ... (die Hoffnung stirbt zuletzt) ;-)

Einen schönen Tag euch allen wünsch ich.
Gaby Leuenberger
als Antwort auf: [#560409] Top
 
X