| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Suchen/Ersetzen via RegExp (8342 mal gelesen)
|
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 17. Sep. 2004 13:32 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich hab' mal versucht Bernd's [bst] RegexReplace für Excel auf ein Selectionset umzustricken, da ich die Idee ganz nett fand. Funktioniert aber nur für DTexte ;-) Ganz unten noch eine kleine Erklärung zum Suchen/Ersetzen, hier erstmal der Code, vielleicht kanns ja wer mal brauchen:
Code:
'Verweis auf Microsoft VBScript Regular Expressions 5.5 setzen Option ExplicitSub such_ersetz() Dim stext As AcadText Dim such$, ersetz$ With ActiveDocument such = .Utility.GetString(1, "Suchstring:") ersetz = .Utility.GetString(1, "Ersatzstring:") End With If such = "" Then Exit Sub regex_it stext, such, ersetz End Sub Sub regex_it(Atext As AcadText, s$, e$) Dim sset As AcadSelectionSet, ent As AcadEntity Dim regex As New RegExp regex.Pattern = s 'Test the Regex On Error Resume Next regex.test "" If Err.Number <> 0 Then MsgBox "Fehler im Ausdruck" Exit Sub End If On Error GoTo 0 Set sset = ActiveDocument.SelectionSets.Add("set01") sset.SelectOnScreen For Each ent In sset If TypeOf ent Is IAcadText Then If regex.test(ent.TextString) Then ent.TextString = regex.Replace(ent.TextString, e) End If End If Next sset.Delete Set regex = Nothing End Sub
Und jetz' noch das Wichtigste, wozu das Ganze nun eigentlich gut sein soll ... ;-) nice w/e lg Nancy -- Text ist komplett written by bst:
Code:
Zur Realisierung wurde die Microsoft VBScript Regular Expressions 5.5 Bibliothek benutzt.Eine Beschreibung dieser Bibliothek findet sich zur Zeit in: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsobjregexp.asp In den folgenden Beipielen steht S für den Suchtext, E für den Ersatztext. Die Anführungszeichen dienen der Lesbarkeit und sind nicht Bestandteil des Such- bzw. Ersatztextes. E="" bedeutet, daß der Ersatztext leerzulassen ist. Löschen von Zeichen: Die ersten 3 Zeichen löschen S="^..." E="" Dito, aber nur falls es sich um Buchstaben handelt S="^[a-zA-Z]{3}" E="" Die letzen 2 Zeichen löschen S="..$" E="" Dito, aber nur falls das vorletzte Zeichen ein '_' ist: S="_.$" E="" Alles bis zum 2. Strichpunkt löschen S="^[^;]*;" E="" Alles ab dem letzten Strichpunkt löschen S=";[^;]*$" E="" (....)' durch '....' ersetzen, d.h. die Klammern löschen. Man beachte, daß die Klammern Metazeichen sind und deshalb 'escaped' werden müssen. S="\((.*)\)" E="$2" Einfügen von Zeichen: Am Anfang 'XY_' einfügen S="^" E="XY_" Am Ende '_END' einfügen S="$" E="_END" Nach dem 2. Zeichen '_neu_' einfügen S="^(..)" E="$2_neu_" Vor dem drittletzten Zeichen _neu_ einfügen S="(...)$" E="_neu_$2" Ersetzen von Zeichen: Punkte durch Kommas ersetzen. Da '.' ein Metazeichen ist, muss seine Sonderbedeutung durch '\.' aufgehoben werden. S="\." E="," Die Zeichenfolge '.2' durch die Zeichenfolge '$1' ersetzen. Man beachte, daß '$1' hier die Zeichenfolge '$1' ergibt, und nicht den 1.ten geklammerten Parameter. M.E. etwas unglücklich. S="\.2" E="$2" Minimal- versus Maximal-Match: Hierzu einfach ein weiteres Beispiel. In einer Zelle stehe der Text "Hallo 12, 34, 56, viele Zahlen 789 hier". Man möchte hier die 1. Zahl in $1 haben, wofür auch immer. Wie's (nicht)? geht: a) S="^.*(\d*).*$" "Überraschung, $1 ist leer. Warum? Hier wurden gleich zwei Fehler gemacht. 1. Ein '*' bedeutet 0 oder mehrmals ... - Man beachte die NULL. 2. Der '*' ist 'greedy', i.e. gefräßig. Hier 'matched' '^.*' einfach den ganzen Text, während für '\d*' und '.*$' leider nichts mehr übrig bleibt." b) S="^.*(\d+).*$" "Etwas besser, durch das '+' erzwingt man den Match einer Ziffer. Allerdings ist '^.*' immer noch gefräßig, so daß man $1=9, i.e. die letzte Ziffer der letzen Zahl erhält." c) S="^.*?(\d+).*$" Funktioniert, da man via '*?' den gefräßigen '*' überlistet hat. Allerdings geht's noch besser: d) S="^\D*(\d+).*$" Hier ist man endlich von dem oft überraschendem, wenn nicht sogar dämlichen '.*' abgekommen welches man ja eigentlich überhaupt nicht haben wollte. Moral: Bevor man einen '.*' einsetzt sollte man mindestens 3-Mal darüber nachdenken, ob man diesen überhaupt will. Nur meine bescheidene Meinung. e) S="(\d+)" "Tut's auch, da RE's auch links-orientiert sind und automatisch der erste passende Match genommen wird. Im Unterschied zum vorherigen Beispiel, wird hier allerdings nur die 1. Zahl 'gematched', während zuvor die ganze Zelle 'gematched' wurde.Dieses spielt allerdings erst beim Ersetzen eine Rolle."
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 17. Sep. 2004 20:20 <-- editieren / zitieren --> Unities abgeben:
Ehm, it's me again, Nachtrag: Das ganze ist natürlich recht simpel gestrickt und auch nicht sonderlich getestet, war also mehr oder weniger nur ein Test/Ansatz. Für weiterführendes, speziell MText betreffend, versteck' ich mich aber schonmal besser im nächstbesten Schrank ;-) Desweiteren ist hier weniger der Code das A&O, sondern eher der einzugebende 'Suchstring', im Nachinein erscheint mir der Begriff fast bissel unglücklich, es ist ja kein 'String' in dem Sinne, sondern eher ein Suchmuster. Das Ganze steht und fällt also mit den korrekten Eingaben, die ich da untenangehängt hatte. [übrigens Danke an Bernd Strohhaecker für die Doku und sowieso] Ich fand' die Möglichkeit des Manipulierens von Texten mittels Regulärer Ausdrücke unter VBA halt einfach mal spannend, wenn auch nicht grad als 'easy to use' zu bezeichnen ... However, es gibt ja zu der Geschichte an sich, auch mehr als einige fertige Progs, die viiieeelviel mehr können, seht's also nur als just for fun/Test und wer Verbesserungsideen hat - gerne. Sodele, das wollt ich blos mal noch ergänzend zu bereits Geschriebenen loswerden, achja, sollte in letzter Zeit ein recht 'monologlastiger Eindruck' entstanden sein, ich weiss, das TF ist woanders ;;-)) Gruss Nancy -- "This process can check if this value is zero, and if it is, it does something child-like." - Forbes Burkowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 18. Sep. 2004 00:24 <-- editieren / zitieren --> Unities abgeben: Nur für startrek
Hi Nancy, > ich hab' mal versucht Bernd's [bst] RegexReplace Wer ist Bernd? Und was hat der damit zu tun? Fehlt da vielleicht ein Link? > 'Verweis auf Microsoft VBScript Regular Expressions 5.5 setzen Öh, wo ist denn der Verweis? > sollte in letzter Zeit ein recht 'monologlastiger Eindruck' > entstanden sein Geht mir manchmal auch so - die wirklich interessanten Dinge interessieren oft kein Schwein;-) RegEx ist ein sehr interessantes Thema. In Lisp gibt es nur das verschissene WCMATCH zum suchen - das taugt absolut nix. Vom Ersetzen gar nicht zu reden. In AutoCAD gibt es zwar "Suchen und Ersetzen", das ist aber eine reine Anwenderfunktion und in Programmen kaum verwendbar. Ich habe mir vor einiger Zeit mal die Mühe gemacht, die PCRE (Perl Compatible Regular Expressions) über ein ARX/ADS-Modul in Lisp einzubinden und das zur Verfügung zu stellen (lag eine Zeit lang bei Cadwiesel). Hat aber wirklich niemanden auch nur die Bohne interessiert... (PCRE ist eine unter der GNU-PL veröffentliche Bibliothek, die die Regular Expressions, wie man sie aus Perl kennt, zur Verfügung stellt. PCRE wird von vielen Projekten verwendet, z.B. in den Sprachen PHP und Python, im Apache usw. usf. Jedenfalls dachte ich mir, wäre ja auch in AutoLisp brauchbar...) Regular Expressions sind ein hocheffizientes Werkzeug zur Bearbeitung von Texten im weitesten Sinne. In VB 7 sind sie übrigens eingebaut - natürlich deshalb, weil sie Bestandteil des .NET-Frameworks sind. Ich weiss aber nicht, inwieweit diese VBScript-RegEx kompatibel zu Perl sind. Bedenkt man, dass RegEX deutlich schwieriger zu erlernen sind als z.B. VisualLisp (der Lernaufwand ist höher, da ist nichts dran zu rütteln!), dann macht es wenig Sinn, sich noch mit irgendwelchen "Dialekten" auseinanderzusetzen. Mein bevorzugter Texteditor "kann" RegEx - aber inkompatibel zu perl und stark vereinfacht. Dinge wie die Greediness und der Kleenesche Stern sind da einfach unter den Tisch gefallen. OK, einfache Dinge sind möglich, aber komplexere Aufgabenstellungen gehen da einfach in die Hose, und ich ärgere mich immer wieder über die Abweichungen vom Perl-Standard. Deine Beispiele sind ja nur der ganz simple Anfang - spätere Aufgabenstellungen könnten z.B. lauten: "(syntaktische) Gültigkeit einer Email-Adresse prüfen" oder "Code Coloring von VBA-Code auf einer HTML-Seite". Das habe ich beides im Einsatz - aber da würde ich mich hüten, von den Perl-Regeln abzuweichen. > (....)' durch '....' ersetzen, d.h. die Klammern löschen. Man > beachte, daß die Klammern Metazeichen sind und deshalb 'escaped' > werden müssen. > S="\((.*)\)" > E="$2" Da zum Beispiel. Nach den Perl-Regeln müsste der Text innerhalb der Klammern $1 sein (die äußeren Klammer bilden ja keine Gruppe, da sie Literale sind). Spielt da Option Base eine Rolle? Oder: Wenn das $2 ist, was ist dann $1? Und was ist $0? (normalerweise - also in perl - ist $0 der zu durchsuchende Text selber, und $1 die erste, äußerste Gruppe, hier also der Inhalt der Klammern) Fragen über Fragen. Ich weiss bisher nicht mal, ob die RegEX im Framework halbwegs 'kompatibel' sind. Hab's bisher nicht ausprobiert. Das wäre ungefähr so: Du machst den Führerschein, aber in jedem Landkreis gelten andere Verkehrsregeln und -schilder. Alles zwar ähnlich, aber zahlen musst du praktisch an jeder Kreuzung;-) Vielleicht weiss ja wer, ob der internationale RegEx-Führerschein auch im Landkreis "VBScript RegEx 5.5" gilt? Gruß, Axel Strube-Zettler ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 18. Sep. 2004 13:45 <-- editieren / zitieren --> Unities abgeben:
Hi Axel, puhhh, Du bist ja wiewohl schon sehr tief in die Materie eingetaucht, was ich von mir nun nicht gerade behaupten kann. Dementsprechend 'flach' fällt wohl auch mein Reply im Endeffekt aus. Von Perl hab' ich absolut keinen Plan, von daher kann ich nix zu den Feinheiten & Unterschieden sagen. Die RegEx' an sich sind schon ein mächtiges Werkzeug, aber eben auch hammermässig schwierig. Ich hab' mich da bisher auch nur auf die einfachsten Sachen beschränkt, wie halt wenn man mal fix paar dTexte ändern will, daher der Versuch das mal ganz bescheiden anzutesten. So komplexe Dinge wie Du beschrieben hast, hab' ich noch gar nicht auch nur ansatzweise versucht, bin von daher auch noch nicht an die Grenzen gestossen. Schade jetz such ich schon geraume Zeit, es gab mal im Offtopic-Bereich auf Herber.de einen Thread zu RegEx wo einige Links zusammengetragen waren, scheint aber irgendwie gelöscht, jedenfalls find' ichs nimmer. Hab' zum Thema jetz blos mal den noch: http://jenda.krynicky.cz/#Jenda.Rex [edit]Ich hab dieses aber noch nicht probiert;-)[/edit] Wg. Bernd, wenn der Bursche;-) mal eine HP hätte, hätte ich ja nen Link gesetzt, so war der Text einfach aus einer xl-Datei von Ihm rauskopiert. >> 'Verweis auf Microsoft VBScript Regular Expressions 5.5 setzen > Öh, wo ist denn der Verweis? Axel, jetz steh' ich aber im Wald, was meinst Du damit? lg Nancy [Diese Nachricht wurde von startrek am 18. Sep. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 18. Sep. 2004 17:03 <-- editieren / zitieren --> Unities abgeben: Nur für startrek
> >> 'Verweis auf Microsoft VBScript Regular Expressions 5.5 setzen > > Öh, wo ist denn der Verweis? > Axel, jetz steh' ich aber im Wald, was meinst Du damit? Damit meinte ich, dass es unter VB(A) doch nicht reicht, nur einen Kommentar einzufügen, um auf etwas zu verweisen: > 'Verweis auf Microsoft VBScript Regular Expressions 5.5 setzen Muss dann da nicht so was kommen? Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type Ich habe übrigens diese PCRE-Geschichte geschrieben, um in AutoCAD Maßtexte zu verändern. Zum Beispiel schreibt ja AutoCAD, wenn es um tolerierte Maße geht, immer beide Toleranzen, auch wenn eine davon 0 beträgt, also 555.0 +0.1 -0.0 (natürlich hoch-und tiefgestellt). Das -0.0 unten ist aber a) unzulässig und b) verwirrend. Mit Acad allein kriegt man's aber nicht wirklich weg. RegEx über die Zeichnung fahren und alle Bemaßungen anpassen, fertig. Gruß, Axel Strube-Zettler <edit> Ach ja, auf dieser Jenda-Seite fiel mir gleich das hier ins Auge: > The Microsoft VBScript Regular Expressions (5.5) object is funny at > best. It is hard to use, leads to lengthy code and really looks like > something a VB "programmer" made. Hab ich doch gleich vermutet;-) </edit> ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 18. Sep. 2004 20:31 <-- editieren / zitieren --> Unities abgeben:
> Damit meinte ich, dass es unter VB(A) doch nicht reicht, > nur einen Kommentar einzufügen, um auf etwas zu verweisen. Ahso - nun, ich hielt es für wesentlich gesünder dem geneigten Tester einen Hinweis zu geben, wo ein Haken zu machen ist, als dass ich erstmal jemandes System verwirre, nur weil trekkie mal versucht hat, eine Lib automatisch laden. Jaja, hier sindse wieder die vba-kiddies, keine Ahnung wie se 'ne DLL korrekt aufrufen, ich geh' dann mal besser Schleudereuter spielen ;-) Okay - ernsthaft, ich versuch' mal zu beschreiben, wie ich das sehe: Die M$ RegEx'Lib ist für simple Sachen, zB wie setze ich meine ganzen DTexte in Klammern?, oder wie entferne ich alles ab irgendeinem Zeichen? uä triviale Dinge, denke mal durchaus zu gebrauchen. Über MText der vielleicht sogar noch formatiert ist, etwa: Textstring = string1 & "\P{\H0.75x;" & string2 & "\P" & string3 & "}" hab' ich jetz mal noch garnicht weiter drüber nachgedacht. Sobald's denn also etwas komplizierter wird bzw. was die Perl-Freaks betrifft sowieso, hast Du sicher recht bzw. ist die 'Jenda-Aussage' völlig zutreffend. Ich mein da setzt sich ja nicht umsonst einer hin und schreibt sich das 1x neu, wenn das M$Dingens auch nur halbwegs perfekt wäre ? Ja und warum das Ganze an sich recht wenige interessiert? Gute Frage, nächste Frage ;-) Keine 'wirkliche' Ahnung, ich vermute einfach mal, weil's halt doch nicht ganz so einfach ist, und nicht jeder sich parallel mit Perl oä auskennt. Die meisten haben ja 'ihr' Werkzeug für Autocad, entweder Lisp oder halt VBA, oder vielleicht auch beides. Und Acad ist ja keine Textverarbeitung in dem Sinne und nicht jeder ist hauptberuflich Programmierer. Gut möglich also, dass diese kryptische Syntax einfach mal brutal abschreckt, wenn sie auch höchstelegant ist. Is aber nur eine Vermutung ;-) lg Nancy -- God is real - until declared integer. [Diese Nachricht wurde von startrek am 18. Sep. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 18. Sep. 2004 21:58 <-- editieren / zitieren --> Unities abgeben: Nur für startrek
Abschreckend isses, ja. Das hier ist der Suchstring, mit dem ich in Lisp Maßtexte aufspüre, deren obere Toleranz Null ist: "(\\\\A1;\\d+[,.]?\\d*\\{\\\\H\\d+\\.?\\d*;\\\\S)[ +-]0[,.]?0*(\\^[ +-]\\d+[,.]?\\d*;\\})" Allerdings muss man in Lisp jeden Backslash doppelt schreiben, daher sieht es noch schlimmer aus, als es so schon ist;-) Gruß, Axel Strube-Zettler ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004
|
erstellt am: 19. Sep. 2004 18:39 <-- editieren / zitieren --> Unities abgeben: Nur für startrek
Abend Axel, die Idee zu dem RegEx-Teil hat Startrek wohl von mir. Ich benutze dieses in Excel. Und dort muß man im VBA nun wirklich nichts anderes tun, als einen Verweis zu setzen. Via Menu Extras-Verweise halt. Eine weitere Deklaration oder sowas ähnliches ist nicht notwendig. > Ich habe mir vor einiger Zeit mal die Mühe gemacht, die PCRE ... Nun, mich würde das sehr wohl interessierern. Aber nicht für LISP sondern für Office VBA. Ich habe schon ein paar Mal in verschiedenen Foren danach gefragt, aber bisher konnte mir keiner weiterhelfen. > Ich weiss aber nicht, inwieweit diese VBScript-RegEx kompatibel zu Perl sind. Leider nicht besonders. Aber auch nicht so unterschiedlich, daß man sie nicht in den Griff bekommen könnte. > Mein bevorzugter Texteditor "kann" RegEx - aber inkompatibel zu perl > und stark vereinfacht Meiner, VIM :-), auch. Leider auch nicht kompatibel zu Perl, aber IMHO in der gleichen Liga, was die Möglichkeiten betrifft. Zumindest im Vergleich mit Perl 5. > Deine Beispiele sind ja nur der ganz simple Anfang - Dieses war nun auch beabsichtigt ;-) >> S="\((.*)\)" >> E="$2" Das ist ganz einfach ein Fehler von mir. Es muß natürlich $1 lauten. Den Kommentar auf der Jenda-Seite hab' ich auch gelesen. Und mich ansonsten darüber gefreut, endlich eine vernünftige PERl-LIB unter VBA ans laufen zu bekommen. Nun ja bis ich es probiert hatte. Irgendwie habe ich es nicht hinbekommen und außerdem ist mir früher oder später Excel eigentlich immer total abgestürzt. Dananch habe ich's halt bei dem M$-Teil belassen :-( Viele Grüße, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 19. Sep. 2004 20:23 <-- editieren / zitieren --> Unities abgeben: Nur für startrek
Hi Bernd, nun weiss ich auch, wer Bernd ist;-) > Das ist ganz einfach ein Fehler von mir. Es muß natürlich $1 lauten Beruhigend;-) > Nun, mich würde das sehr wohl interessierern. Aber nicht für LISP > sondern für Office VBA Windows binaries gibt's hier: http://gnuwin32.sourceforge.net/packages/pcre.htm Das sollte doch irgendwie gehen. > nicht kompatibel zu Perl, aber IMHO in der gleichen Liga, was > die Möglichkeiten betrifft Das ist für mich das Problem: Ständig umdenken müssen - ich bin doch nicht mehr so flexibel in meinem Alter;-) Mir geht's darum, RegEx-Ausdrücke, die mal in einem Programm funktioniert haben, ohne Änderungen und Anpassungen woanders benutzen zu können. Da ist doch so ein Quasi-Standard was Feines... Gruß, Axel Strube-Zettler ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004
|
erstellt am: 19. Sep. 2004 22:01 <-- editieren / zitieren --> Unities abgeben: Nur für startrek
Abend Axel, Danke für den Link. Werde das mal probieren. > Das ist für mich das Problem: Ständig umdenken müssen - ich bin doch > nicht mehr so flexibel in meinem Alter;-) Mir geht's darum, > RegEx-Ausdrücke, die mal in einem Programm funktioniert haben, ohne > Änderungen und Anpassungen woanders benutzen zu können. Da ist doch > so ein Quasi-Standard was Feines... Ich persönlich fände es auch viel besser überall die gleiche Syntax benutzen zu können. Aber leider gibt's ja wohl keinen wirklichen (erweiterten) RegExp-Standard. Und auch nicht alle wollen wohl auf PERL-Syntax wechseln. Zumindestens blieben meine bisherigen Anfragen bei VIM bzw. VIM-DEV leider ziemlich erfolglos :-( Schönen Abend noch, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 18. Jan. 2005 20:49 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von mapcar: Damit meinte ich, dass es unter VB(A) doch nicht reicht, nur einen Kommentar einzufügen, um auf etwas zu verweisen:> 'Verweis auf Microsoft VBScript Regular Expressions 5.5 setzen Muss dann da nicht so was kommen? Declare Function publicname Lib "libname" [Alias "alias"] [(ByVal] variable [As type] [,[ByVal] variable [As type...])] As Type
dies hat mir ja nun teilweise schlaflose Nächte bereitet, deswegen: wenn ich auch ein sehr, sehr spätes Mädchen bin, ich weiss ... was das automatische Referenzieren einer Lib angeht, irgendwie geht das so, wundersamerweise läuft acad sogar noch nach meinem Rumgepfusche im Urcode ;-) Gruss Nancy -- ... also, für alle die's intressiert
Code:
Option Explicit Private Declare Function SystemVerzeichnis Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Public Sub test() Dim intIndex As Integer, bolfound As Boolean Dim TempBuffer As String * 255, WinSysDir As String, ReturnCode As Long ReturnCode = SystemVerzeichnis(TempBuffer, 255) WinSysDir = Left$(TempBuffer, ReturnCode) With Application.VBE.activevbProject.references For intIndex = 1 To .Count If Right(.Item(intIndex).FullPath, InStr(1, StrReverse(.Item(intIndex).FullPath), "\") - 1) = "3" Then bolfound = True: Exit For Next If Not bolfound Then .AddFromFile WinSysDir & "\vbscript.dll\3" End With End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 30. Jan. 2005 19:45 <-- editieren / zitieren --> Unities abgeben:
Ich bleib' mal in dem Thread, da das Thema doch etwas spezifisch ist: im Rahmen dieses Threads http://ww3.cad.de/foren/ubb/Forum54/HTML/009666.shtml, war ich zwar vba-functions-technisch dran, is aberein Fass ohne Boden. Hab' heute zum Sonntag mal noch bissel rumgespielt, Basis war Axels Ausdruck: pattern = "(.*?)\{\\f.*?;(.*?)\}(.*)" aus diesem Thread: http://ww3.cad.de/foren/ubb/Forum54/HTML/004190.shtml#000012 Leider berücksichtigt der keine Höhenangaben bei formatiertem Text, oder aber ich bin zu blöd dazu. Bekomms schlichtweg nicht hin, die /H*x; Dinger rauszuzaubern ... Also sprich, als Ziel nur die 'reinen' Texte und /P == Umbrüche rauszufiltern ... Nochwas - hab nicht alle möglichen Kombinationen von Höhen/Texten[ttf oder shx]/ Unterstreichungen [da wirds gaaanz ganz finster] durch, deswegen kann gut und gerne im Falle X nicht gehen, trotzdem nur mal so noch als Ansatz: Code:
Sub clearFormats_with_Regex() Dim sset As AcadSelectionSet, ent As AcadEntity, re As New RegExp Dim s As String Set sset = ActiveDocument.SelectionSets.Add("set01") sset.SelectOnScreen re.IgnoreCase = 1: re.Global = 1 For Each ent In sset If TypeOf ent Is IAcadMText Then re.Pattern = "(.*?)\{\\f.*?;(.*?)\}|\{\\f.*?\\H.*x;(.*?)\}(.*)" 're.Pattern = "(.*?)\{\\f.*?;(.*?)\}|\{\\f.*?\\H\d+x;(.*?)\}(.*)" ent.TextString = re.Replace(ent.TextString, "$1$2$3") Debug.Print ent.TextString End If Next sset.Delete Set re = Nothing End Sub
lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RoSiNiNo Mitglied Konstrukteur
Beiträge: 1126 Registriert: 09.10.2002 Acad 2011-deutsch, Express Tools 3ds Max 2010 Win 7-Professional HP Workstation Z400, 6GB GeForce GTX 470
|
erstellt am: 04. Feb. 2005 13:50 <-- editieren / zitieren --> Unities abgeben: Nur für startrek
|
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 07. Feb. 2005 21:07 <-- editieren / zitieren --> Unities abgeben:
hey Roland, danke auch für den Link! und wieder einer mehr im Boot - schön, vielleicht können wir ja irgendwann mal sowas wie nen Club bilden ;-) Naja, zugegeben, das mit den 30 min. hat bei mir nich so ganz funktioniert ..., aber wenigstens weiss ich jetze, warum das mit dem | == 'oder' nicht klappte, da muss man mit den kompliziertesten Mustern beginnen und nach hinten sukzessive vereinfachen [glaube], wieauchimmer, bin jetzt damit hier und habe es ziemlich verschlimmbessert [geht nämlich garnich mehr großartig] *g* Aber ich bleib dran, muss doch irgendwie gehen [dieses Jahr noch;-)] lg Nancy
Code:
Urstring = "123{\fArial Black|b0|i0|c0|p34;456\P}789;10;11;{\fHelvetica56|b0|i0|c0|p34;\H2x;12;13\P}14;{\Fscriptc.shx;\H2x;15\H0.25x;;16}" re.Pattern = "(.*?)\{\\f.*?\\H\d{1,2}\.\d{1,2}x;(.*?)\}|\{\\f.*?\\H\d{1,2}x;(.*?)\}|\{\\f.*?;(.*?)\}(.*)"
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|