[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt GREP \w mit match()

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

GREP \w mit match()

Uwe Laubender
Beiträge gesamt: 5350

23. Okt 2009, 09:55
Beitrag # 1 von 19
Bewertung:
(6635 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, zusammen!
Bin gerade etwas von der Rolle. \w sollte doch in GREP alle alphanumerischen Zeichen repräsentieren? Daß es da Ausnahmen gibt, hatte ich bereits in der GREP-Suche von InDesign CS3(Mac) bemerkt: das "ß" wird dort nicht erkannt.

Im ESTK bin ich noch auf eine schwerwiegendere Einschränkung gestoßen. Probiert mal folgendes:
Code
string1 = new String("Grüße"); 
array1 = new Array(string1.match(/\w/g));

"ü" und "ß" werden nicht in das Array geschrieben.
Code
string1 = new String("Grüße"); 
array1 = new Array(string1.match(/./g));

hingegen macht den Job.

Ist das ein GREP-Umsetzungsproblem, ExtendScript betreffend, von Adobe? Ein Bug?
In welcher Dokumentation könnte man solche Einschränkungen/Abweichungen nachlesen?
Oder muß ich beim Einsatz eines GREPs in Zukunft den ganzen zu untersuchenden Zeichensatz nach Unregelmäßigkeiten absuchen?

Bitte testet das auch mal mit ESTK-Versionen CS3 und CS4 vor allem auf Windows.
X

GREP \w mit match()

Hans Haesler
  
Beiträge gesamt: 5826

23. Okt 2009, 10:39
Beitrag # 2 von 19
Beitrag ID: #412266
Bewertung:
(6620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

ich kann Deine Beobachtung bestätigen. Unter Windows, mit CS2.

Was auch funktioniert:
Code
string1 = new String("Grüße"); 
array1 = new Array(string1.match(/[0-9A-Za-zÀ-ü]/g));

Vorteil: Dadurch werden viel weniger nicht-alphanumerische Zeichen gefunden.

Die UI-Suche (mit CS4 unter Mac OS X) hingegen findet "ü" und "ß" mit "\w" im "Suchen nach"-Feld.

Gruss, Hans


als Antwort auf: [#412244]

GREP \w mit match()

Uwe Laubender
Beiträge gesamt: 5350

23. Okt 2009, 10:48
Beitrag # 3 von 19
Beitrag ID: #412269
Bewertung:
(6617 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Hans!
Danke für die Bestätigung unter Windows. Ich werde mal meine Beobachtungen im Adobe Forum InDesign/Scripting reinstellen. Vielleicht gibt's ja noch umfangreichere Dokumentationen zur Umsetzung von GREP in ExtendScript.


als Antwort auf: [#412266]

GREP \w mit match()

Hans Haesler
  
Beiträge gesamt: 5826

23. Okt 2009, 11:15
Beitrag # 4 von 19
Beitrag ID: #412282
Bewertung:
(6606 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

bitteschön.

Ach ja, habe ich vergessen zu erwähnen: Den Test habe ich ab Skriptenpalette und mit "alert" gemacht.

Das grausliche ESTK werfe ich höchst selten an.

Gruss, Hans


als Antwort auf: [#412269]

GREP \w mit match()

Neil77
Beiträge gesamt: 287

23. Okt 2009, 11:46
Beitrag # 5 von 19
Beitrag ID: #412291
Bewertung:
(6594 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

unter CS3/Win sieht's genauso aus.

Ich vermute, der Grund ist, dass string.match() ein Basisbestandteil von JavaScript ist, also nicht Adobe-spezifisch.
Die ID-GREP-Suche wurde wohl (sinnvollerweise) an weitere Zeichen wie Umlaute oder ß angepasst, entsprechend funktioniert ja auch die findGrep()-Funktion in Skripten.
match() dagegen verhält sich entsprechend der normalen Javascript-Spezifikation, findet folglich keine Umlaute über \w.

Grüße


als Antwort auf: [#412282]

GREP \w mit match()

Neil77
Beiträge gesamt: 287

23. Okt 2009, 11:53
Beitrag # 6 von 19
Beitrag ID: #412295
Bewertung:
(6589 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Jetzt muss ich mir nochmal teilweise selbst widersprechen ...
Nach den Javaskript- bzw. Perl-Spezifikationen, die ich auf die Schnelle im Netz gefunden habe, hängt es von den Systemeinstellungen ab, ob \w auch Umlaute findet. Das sollte alleine also kein Hinderungsgrund sein!

Wichtig finde ich dennoch, dass match() und findgrep() wohl auf verschiedene Routinen zurückgreifen. Ich halte das also nicht unbedingt für einen Bug, aber auch nicht gerade für ein sehr praktisches Verhalten ...

Oder funktioniert findgrep() im Gegensatz zu Win auf dem Mac auch anders als erwartet?

Grüße


als Antwort auf: [#412291]

GREP \w mit match()

Uwe Laubender
Beiträge gesamt: 5350

23. Okt 2009, 13:01
Beitrag # 7 von 19
Beitrag ID: #412312
Bewertung:
(6567 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Martin!
Antwort auf [ Neil77 ] Oder funktioniert findgrep() im Gegensatz zu Win auf dem Mac auch anders als erwartet?

Kann schon sein, daß der "Scope" von Wildcarts unterschiedlich implementiert wurde. Gerald Singelmann hat das ja bereits für InDesign CS3 nachgewiesen. Ich kann's leider für InDesign CS4 nicht testen, da ich über keine Windows-Version verfüge.

findgrep() greift auf die Suchroutinen von InDesign zu, match() nicht. match() hätte halt den Vorteil, daß es wesentlich schneller abläuft als findgrep(). Aber wie es aussieht, ist match(/\w/g) im Gegensatz zu findgrep() sehr eingeschränkt.


als Antwort auf: [#412295]

GREP \w mit match()

Uwe Laubender
Beiträge gesamt: 5350

23. Okt 2009, 13:43
Beitrag # 8 von 19
Beitrag ID: #412328
Bewertung:
(6556 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!
Um den Unterschied zwischen findGrep() und match() noch klarer zu machen:

Code
var myDoc = app.documents[0];  
app.documents.add();
app.documents[0].textFrames.add({
geometricBounds:[0,0,30,100],
contents:"^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm, .- °!\"§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ'>YXCVBNM;:_ „¡“¶¢[]|{}¿'«€®†¨@œæ‘&¥ç&~µ…– “¬”#£^\˜·¯»„‰¸ÁÛØ°ÅÍ™ÏÌÓˆŒÆ’‡ÙÇ‹›÷—",
label:"ToSearch"});

var myArray = new Array();

app.findGrepPreferences.findWhat = "\\w";
var myFind = myDoc.textFrames.item("ToSearch").findGrep();

for (n=0; n<myFind.length; n++){
myArray.push(myFind[n].contents);
};
var myString1 = myArray.join();

app.documents[0].textFrames.add({
geometricBounds:[40,0,70,100],
contents:"Found by findGrep() with findWhat = \"\\\\w\"\r"+myString1,
label:"Found by findGrep()"
});

myString2 = myDoc.textFrames.item("ToSearch").contents.match(/\w/g);

app.documents[0].textFrames.add({
geometricBounds:[80,0,110,100],
contents:"Found by match(/\w/g)\r"+myString2,
label:"Found by match(/\w/g)"
});


Das Script erzeugt ein neues Dokument, legt einen Textrahmen mit beinahe allen auf der Tastatur verfügbaren Zeichen an, dann wird nach \w mit findGrep() gesucht, das Ergebnis in einen entsprechend kommentierten Textrahmen geschrieben, dann kommt match(/\w/g) mit der Suche dran und schreibt das Ergebnis in einen weiteren entsprechend kommentierten Textrahmen.


als Antwort auf: [#412312]
(Dieser Beitrag wurde von Hans Haesler am 23. Okt 2009, 15:08 geändert)

GREP \w mit match()

Hans Haesler
  
Beiträge gesamt: 5826

23. Okt 2009, 14:50
Beitrag # 9 von 19
Beitrag ID: #412356
Bewertung:
(6543 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

danke für diesen Vergleich (in Zeile 20 ist ein Anführungszeichen zuviel).

Ein Detail: Unter Mac OS X, mit CS4, schaffen es die beiden Backslashes (Positionen im String: 51 und 133, ohne die überflüssigen Leerschläge zu zählen) nicht in den zu untersuchenden Rahmen.

Ich habe noch ein weiteres Ergebnis umsetzen lassen: Anstelle von "\w" wird mein Vorschlag "[0-9A-Za-zÀ-ü]" verwendet.

Gruss, Hans


als Antwort auf: [#412328]

GREP \w mit match()

Uwe Laubender
Beiträge gesamt: 5350

23. Okt 2009, 15:05
Beitrag # 10 von 19
Beitrag ID: #412360
Bewertung:
(6540 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Hans!
Antwort auf [ Hans Haesler ] danke für diesen Vergleich (in Zeile 20 ist ein Anführungszeichen zuviel).

Zeile 20 sollte eigentlich so heißen (hatte aber beim Verfassen im HDS-Eingabefenster noch etwas geändert, das den Fehler verursachte):
Code
contents:"Found by findGrep() with findWhat = \"\\\\w\"\r"+myString1, 

Kannst Du das als Moderator bitte noch korrigieren?


als Antwort auf: [#412356]

GREP \w mit match()

Hans Haesler
  
Beiträge gesamt: 5826

23. Okt 2009, 15:10
Beitrag # 11 von 19
Beitrag ID: #412361
Bewertung:
(6533 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

Dein Wunsch ist mein Befehl! :-)

Gruss, Hans


als Antwort auf: [#412360]

GREP \w mit match()

Uwe Laubender
Beiträge gesamt: 5350

23. Okt 2009, 15:28
Beitrag # 12 von 19
Beitrag ID: #412367
Bewertung:
(6523 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Hans!
Herzlichen Dank.
Antwort auf [ Hans Haesler ] Ich habe noch ein weiteres Ergebnis umsetzen lassen: Anstelle von "\w" wird mein Vorschlag "[0-9A-Za-zÀ-ü]" verwendet.

Der GREP:
Code
findWhat = "\[0-9A-Za-zÀ-ü\]" 

im Vergleich mit:
Code
match(/[0-9A-Za-zÀ-ü]/g) 

und AUCH im Vergleich mit:
Code
findWhat = "\\w" 

ergibt jedenfalls das identische Ergebnis. Sehr gut! Hast Du über die Systemplattformen hinweg testen können, ob die Ergebnisse auch da identisch sind?


als Antwort auf: [#412356]
(Dieser Beitrag wurde von Uwe Laubender am 23. Okt 2009, 15:35 geändert)

GREP \w mit match()

Hans Haesler
  
Beiträge gesamt: 5826

23. Okt 2009, 15:32
Beitrag # 13 von 19
Beitrag ID: #412370
Bewertung:
(6515 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

bitteschön.

Nein, habe ich nicht testen können, weil ich unter Windows nur CS2 zur Verfügung habe.
Aber es wird sich schon jemand melden.

Gruss, Hans


als Antwort auf: [#412367]

GREP \w mit match()

Uwe Laubender
Beiträge gesamt: 5350

23. Okt 2009, 16:07
Beitrag # 14 von 19
Beitrag ID: #412381
Bewertung:
(6493 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Hans!
Ich muß mich leider in einem Punkt korrigieren. Die beiden findWhat-Definitionen zeigen unterschiedliche Ergebnisse. Siehe beigefügtem Screenshot "Unterschiede2.png". Die roten Zeichen wurden NICHT gefunden. Ich war einfach zu schnell bei der Auswertung.

Edit: neuer Screenshot.


als Antwort auf: [#412370]
(Dieser Beitrag wurde von Uwe Laubender am 23. Okt 2009, 16:11 geändert)

Anhang:
Unterschiede2.png (41.7 KB)

GREP \w mit match()

Hans Haesler
  
Beiträge gesamt: 5826

23. Okt 2009, 16:15
Beitrag # 15 von 19
Beitrag ID: #412384
Bewertung:
(6487 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

ja, das hatte ich mit CS4 auch festgestellt. Das ist aber normal, weil diese Zeichen ausserhalb der definierten Bereiche liegen.

Gruss, Hans


als Antwort auf: [#412381]
(Dieser Beitrag wurde von Hans Haesler am 23. Okt 2009, 16:18 geändert)
X