[Regex] Unterschiedlicher Replace

amn.ssy

Erfahrenes Mitglied
Hallo,

mit Regex (hier speziell unter VB bzw. VBS) beschäftige ich mich noch nicht allzu lange, aber immerhin haben sich schon die ersten Erfolge eingestellt :)
Aktuell finde ich jedoch keinen Ansatz den Pattern und das VBS so aufzudrösseln, daß in einem Rutsch zwei Fälle unterschieden werden und somit auch ein unterschiedlicher Replace stattfindet.
Ich hab' mal so versucht:

Code:
Set fso=CreateObject("Scripting.FileSystemObject")
T=fso.OpenTextFile(WScript.Arguments(0)).ReadAll
Set re1=New RegExp
Set re2=New RegExp
re1.Pattern="( {2,})"
re2.Pattern="(\.{2,})|( \.)|(\. )|(/[^\d]/)"
re1.Global=True
re2.Global=True
fso.CreateTextFile(WScript.Arguments(1),True).Write re1.Replace(T," ")
fso.CreateTextFile(WScript.Arguments(1),True).Write re2.Replace(T,"")

Ursprünglich war das Pattern in einem und es gab auch nicht die -2-er Schiene.
Grundsätzlich aht das auch funktioniert, aber nicht unbedingt mit einem zuzfriedenstellenden Ergebnis.
Ich habe in dem Text in den jeweiligen Zeilen eine unterschiedliche und unspezifizierte Anzahl von Leerzeichen und\oder Punkte, welche Leerzeichen folgen können oder auch vorausgehen.
Ziel ist es, halbwegs wohlgeformte Textzeilen zu erhalten in der alle Punkte (außer in Zahlen) durch NICHTS und alle Leerzeichen größer 2 durch 1 Leerzeichen ersetzt werden.

Super wäre es wenn man das das ganze noch dahin bekommen könnte, daß nach mg, min und % ein " : " eingefügt wird.

Grüße

_opiwahn_
 
Zuletzt bearbeitet:
Du kannst doch im ersten Teil des zweitern Patterns eine Auswahl machen mit []
Eigetnlich solltes es doch reichen alle Kombination von Leerzeichen und Punkt die länger als 2 ist zu tilgen.
Code:
re2.Pattern="([\. ]{2,}"
 
Hallo Yaslaw,
hallo an alle anderen,

vielen Dank für den Tipp - in der Tat war's dann doch so einfach (fast) ans Ziel zu kommen :)
Der Code siehe nun so aus (würde bestimmt auch eleganter gehen):
PHP:
Set fso=CreateObject("Scripting.FileSystemObject")
  T=fso.OpenTextFile(WScript.Arguments(0)).ReadAll
    Set re1=New RegExp
          re1.Pattern="( {2,})|([\. ]{2,})"
          re1.Global=True
fso.CreateTextFile(WScript.Arguments(1),True).Write re1.Replace(T," ")

Hab mir in den letzten Stunden das Thema "lookahead" und "lookbehind" angeschaut und nicht verstanden :-(
Gibt es ein eingängiges Tutorial mit diversen Beispielen hierzu?
Ziel soll sein (ich hoffe mal, daß es mit look.. funktioniert) "replace 1st character after/before match"
ZB:
- ersetze das erste leerzeichen nach "mg" | "min" | "%" durch ":"
- ersetze das erste leerzeichen vor "<=" | "=>" durch ":"

Ich vermute mal, daß diese Ersetzungen noch vor den aktuellen "( {2,})|([\. ]{2,})" durcu " " laufen müssen.

Grüße

_opiwahn_
 
Zuletzt bearbeitet:
Bin schon mal ein Stück weiter gekommen, zumindest stimmt laut http://regexpal.com/ der Ausdruck und es werden auch die korrekten Stellen angezeigt.
Leider funktioniert der Code nicht wie gewünscht - die auskommentierten Zeilen produzieren "Müll"!
Ich vermute mal, daß das ganze in eine Scheife o.ä. muß, damit ich die beiden Fälle unterscheiden kann.

PHP:
Set fso=CreateObject("Scripting.FileSystemObject")
T=fso.OpenTextFile(WScript.Arguments(0)).ReadAll
Set re1=New RegExp
'Set re2=New RegExp
re1.Pattern="( {2,})|([\. ]{2,})"
're2.Pattern="[(?<=/>|/<|/%|min|mg)]\s{1}(?=\d)"
re1.Global=True
're2.Global=True
fso.CreateTextFile(WScript.Arguments(1),True).Write re1.Replace(T," ")
'fso.CreateTextFile(WScript.Arguments(1),True).Write re2.Replace(T,":")

Oder liege ich hier völlig falsch? Wie läßt sich eine Fallunterscheidung einbringen?
Normalerweise geht sowas ja mit if ... then ... - aber hier?

Danke schon mal für die Unterstützung

_opiwahn_
 
"lookbehind" kennt VBS-Regexp meines Wissens leider nicht. Ist aber für sowas auch nicht nötig.
Du kannst mit $1, $2 etc auf die Werte die du im Pattern in eine Klammer setzt zugreiffen

Es lohnt sich hier diese Korrekturen Schritt für Schritt zu machen

Mein Test
Visual Basic:
    Dim html As String
    Dim rx  As New RegExp
    
    html = _
"200853-19334-2015_ocr.txt:       BATCH No..................................................       : 19334" & vbCrLf & _
"200853-19334-2015_ocr.txt:       MANUFACTURING DATE.........................                      : 03/19/2012" & vbCrLf & _
"200853-19334-2015_ocr.txt:      Average mass of content                                           from 111.5 to 123.0mg                    117.7" & vbCrLf & _
"200853-19334-2015_ocr.txt:      Disintegration time                                               <=   15min                               3" & vbCrLf & _
"200853-19334-2015_ocr.txt:      Dissolution test at 20 minutes                                   =>    75%                                 96" & vbCrLf & _
"200853-19334-2015_ocr.txt:      Dissolution test at 40 minutes                                   =>    90%                                 101"

    rx.Global = True
    rx.IgnoreCase = True
    rx.Multiline = True
    
    rx.Pattern = "(%|min|mg) "
    html = rx.Replace(html, "$1:")
    
    rx.Pattern = " (<=|=>)"
    html = rx.Replace(html, ":$1")
    
    rx.Pattern = "[ \.]{2,}"
    html = rx.Replace(html, " ")
    
    Debug.Print html

ergibt
Code:
200853-19334-2015_ocr.txt: BATCH No : 19334
200853-19334-2015_ocr.txt: MANUFACTURING DATE : 03/19/2012
200853-19334-2015_ocr.txt: Average mass of content from 111.5 to 123.0mg: 117.7
200853-19334-2015_ocr.txt: Disintegration time :<= 15min: 3
200853-19334-2015_ocr.txt: Dissolution test at 20 minutes :=> 75%: 96
200853-19334-2015_ocr.txt: Dissolution test at 40 minutes :=> 90%: 101

Nachtrag:
Ausführlich:
http://www.experts-exchange.com/Pro...asic-for-Applications-and-Visual-Basic-6.html
 
Hallo Yaslaw,

zunächst mal [click] Danke für deine Mühe.
Bin schon mal ne ganze Ecke weitergekommen und hab das ganze jetzt sogar in einer Schleife.
An dem einen oder anderen Punkt könnte sicher noch geschliefen werden, aber es funktioniert erstmal wie gewünscht.
Code:
PHP:
Set fso = CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(WScript.Arguments(0)).ReadAll

With New RegExp

	.Global = True
	.IgnoreCase = True
	.Multiline = True

    	.Pattern = "(from|of content|fenofibrate)"
    	T = .Replace(T, "")

    	.Pattern = "(:)"
    	T = .Replace(T, ";")

    	.Pattern = "(mass|%|min|mg|/g|/tab|/cap) "
	T = .Replace(T, "$1 ; ")
    	
    	.Pattern = " (<=|=>)"
	T =.Replace(T, " ; $1")

   	 .Pattern = "[. ]{2,}"
    	T = .Replace(T, " ")



End With

fso.CreateTextFile(WScript.Arguments(1), True).Write(T)

Für was so ein 1. Mai doch alles ist :)
So weit kann ich schon mal was damit anfangen.
Wenn es mir gelingt das Ganze noch etwas mehr zu flexibilisieren spart mir das etwa 1 Arbeitstag im Monat, den ich für was anderes verwenden kann - z.B. das "Nächste" automatisieren ;-)

In diesem Kontext würde beispielsweise noch das "sichere" löschen von doppelten Zeilen anstehen.
Bestenfalls noch im gleichen Script.
Alles andere ist wohl ein neuer Thread :)

Gruß
_opiwahn_
 
Zuletzt bearbeitet:
Zurück