|  | 		    
					
        
         
          
         
	
          | |  | Regular expressions Fra : Lars Hoffmann
 | 
 Dato :  14-12-03 20:58
 | 
 |  | Jeg har et problem som jeg tror regEx kan løse for mig, Problemet er dog
 at jeg ikke er så stiv til at skrive regex (faktisk kan jeg overhovedet
 ikke finde ud af det).
 
 vi antager at jeg har en variable på nogenlunde denne måde:
 
 tekst = "en tekst <LINK:XX>linktekst</LINK>"
 
 hvor XX er et vilkårligt heltal
 
 jeg ville gerne ved jeg af et regEx nå frem til:
 
 "en tekst linktekst"
 
 Nogen der kan give et vbscript ASP eksempel på hvordan det kan gøres?
 
 På foprhånd tak
 Lars Hoffmann
 
 
 
 |  |  | 
  Jacob Nielsen (14-12-2003) 
 
	
          | |  | Kommentar Fra : Jacob Nielsen
 | 
 Dato :  14-12-03 21:41
 | 
 |  | "Lars Hoffmann" <lars@intercambiodvd.com> wrote in message
 news:Xns9451D594C6056intercambiodvdPUNTOc@130.133.1.4...
 > Jeg har et problem som jeg tror regEx kan løse for mig, Problemet er dog
 > at jeg ikke er så stiv til at skrive regex (faktisk kan jeg overhovedet
 > ikke finde ud af det).
 >
 > vi antager at jeg har en variable på nogenlunde denne måde:
 >
 > tekst = "en tekst <LINK:XX>linktekst</LINK>"
 >
 > hvor XX er et vilkårligt heltal
 >
 > jeg ville gerne ved jeg af et regEx nå frem til:
 >
 > "en tekst linktekst"
 >
 > Nogen der kan give et vbscript ASP eksempel på hvordan det kan gøres?
 
 Hmm, det du skal have gjort er altså at have fjernet et "html"-tag fra en
 string?
 
 I så fald burde nedestående funktion kunne klare det for dig:
 
 function funcClearHTMLTags(strHTML, intWorkFlow)
 dim objRegExp, strTagLess
 strTagless = strHTML
 set objRegExp = New RegExp
 objRegExp.IgnoreCase = True
 objRegExp.Global = True
 objRegExp.Pattern = "<[^>]*>"
 strTagLess = objRegExp.Replace(strTagLess, "")
 objRegExp.Pattern = "[<]"
 strTagLess = objRegExp.Replace(strTagLess, "<")
 objRegExp.Pattern = "[>]"
 strTagLess = objRegExp.Replace(strTagLess, ">")
 set objRegExp = nothing
 funcClearHTMLTags = strTagLess
 end function
 
 Så kalder du bare funktionen således:
 
 funcClearHTMLTags(tekst)
 
 hvor tekst altså er navnet på din variabel.
 
 - Jacob
 
 
 
 
 |  |  | 
  Lars Hoffmann (14-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  14-12-03 21:49
 | 
 |  | Jacob Nielsen escribió / skrev
 
 > Hmm, det du skal have gjort er alts† at have fjernet et "html"-tag
 > fra en string?
 
 Nej, ikke et hvilket som helst html tag, men lige præcis pseudo-tagget
 <LINK:XX>  (det er et tag jeg senere bruger til at generere links med,
 men jeg ønsker ikke at gemme en lang linktekst dirrekte i database.)
 
 Hvordan siger man "et hvilket som helst tal" på regEx'lsk?
 
 Ville følgende virke?
 
 function funcClearHTMLTags(strHTML, intWorkFlow)
 dim objRegExp, strTagLess
 strTagless = strHTML
 set objRegExp = New RegExp
 objRegExp.IgnoreCase = True
 objRegExp.Global = True
 objRegExp.Pattern = "<LINK*>"
 strTagLess = objRegExp.Replace(strTagLess, "")
 objRegExp.Pattern = "</LINK>"
 strTagLess = objRegExp.Replace(strTagLess, "")
 end function
 
 
 
 Med venlig hilsen
 Lars Hoffmann
 
 
 |  |  | 
  Jens Gyldenkærne Cla~ (14-12-2003) 
 
	
          | |  | Kommentar Fra : Jens Gyldenkærne Cla~
 | 
 Dato :  14-12-03 22:15
 | 
 |  |  |  |  | 
   Lars Hoffmann (14-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  14-12-03 22:32
 | 
 |  | 
 
            Jens Gyldenkærne Clausen escribió / skrev
 > Pr›v med "<LINK\d+>"
 ....
 > Du kan i ›vrigt teste regex online her
 > <http://regexlib.com/RETester.aspx>. Super - Tusind tak for hjælpen.
 Med venlig hilsen
 Lars Hoffmann
            
             |  |  | 
   Lars Hoffmann (16-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  16-12-03 20:01
 | 
 |  | 
 
            Jens Gyldenkærne Clausen escribió / skrev
 > Du kan i øvrigt teste regex online her
 > <http://regexlib.com/RETester.aspx>. Ahhhhr jeg fatter ikke de skide regEx! Jeg skal have et regEx der minder 
 lidt om: "\btest\b" hvor b må være en hvilken som helt word boundary dog 
 ikke > i starten el < i slutningen.
 Jeg mangler altså nodet der matcher følgende:
 test
 ..test.
 en test
 men ikke 
 >test
 test<
 Med venlig hilsen
 Lars Hoffmann
            
             |  |  | 
  Jens Gyldenkærne Cla~ (16-12-2003) 
 
	
          | |  | Kommentar Fra : Jens Gyldenkærne Cla~
 | 
 Dato :  16-12-03 22:37
 | 
 |  | 
 
            Lars Hoffmann skrev:
 > Ahhhhr jeg fatter ikke de skide regEx! Jeg skal have et regEx
 > der minder lidt om: "\btest\b" hvor b må være en hvilken som
 > helt word boundary dog ikke > i starten el < i slutningen.
 Kan du bruge dette: [\s.,;\-<]test[\s.,;\->]
 Det svarer ikke helt til det du efterspørger - primært fordi den
 "tomme" ordgrænse ikke er med (derfor matches "test", "test mig" og
 "en test" ikke). Det kan dog løses relativt enkelt ved at udvide
 inputstrengen med mellemrum i begge ender.
 -- 
 Jens Gyldenkærne Clausen
 Svar venligst under det du citerer, og citer kun det der er
 nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
 hvordan på http://usenet.dk/netikette/citatteknik.html |  |  | 
   Lars Hoffmann (17-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  17-12-03 00:22
 | 
 |  | Jens Gyldenkærne Clausen escribió / skrev
 
 > Det svarer ikke helt til det du eftersp›rger - prim‘rt fordi den
 > "tomme" ordgr‘nse ikke er med (derfor matches "test", "test mig" og
 > "en test" ikke). Det kan dog l›ses relativt enkelt ved at udvide
 > inputstrengen med mellemrum i begge ender.
 
 Mjaeh, nu må jeg jo lige se på om det er så enkelt, hehe. Anyway, tak
 for hjælpen.
 Med venlig hilsen
 Lars Hoffmann
 
 
 |  |  | 
   Torben Brandt (17-12-2003) 
 
	
          | |  | Kommentar Fra : Torben Brandt
 | 
 Dato :  17-12-03 02:28
 | 
 |  | Jens Gyldenkærne Clausen skrev:
 > Kan du bruge dette: [\s.,;\-<]test[\s.,;\->]
 >
 > Det svarer ikke helt til det du efterspørger - primært fordi den
 > "tomme" ordgrænse ikke er med (derfor matches "test", "test mig" og
 > "en test" ikke). Det kan dog løses relativt enkelt ved at udvide
 > inputstrengen med mellemrum i begge ender.
 
 Ang. den tomme ordgrænse:
 ^ matcher starten på strengen
 $ matcher slutningen på strengen
 så hvis man indsatte dem, så ville man vel også have den tomme ordgrænse
 med i mængden...
 
 mvh Torben
 
 
 
 |  |  | 
  Jens Gyldenkærne Cla~ (17-12-2003) 
 
	
          | |  | Kommentar Fra : Jens Gyldenkærne Cla~
 | 
 Dato :  17-12-03 11:27
 | 
 |  | 
 
            Torben Brandt skrev:
 > Ang. den tomme ordgrænse:
 >   ^ matcher starten på strengen
 >   $ matcher slutningen på strengen
 > så hvis man indsatte dem, så ville man vel også have den tomme
 > ordgrænse med i mængden...
 Du kan ikke bruge ^ og $ som tegn i en tegngruppe. Skriver man:
        [\s.,;\-<^]test[\s.,;\->$]
 - optræder ^ og $ som almindelige tegn, ikke som markører for hhv.
 streng-begynd og streng-slut.
 Skriver man i stedet:
        ^[\s.,;\-<]test[\s.,;\->]$
 - vil det kun matche udtryk for første tegn er et skilletegn, 2-5
 tegn er "test" og sjette og sidste tegn igen er et skilletegn.
 -- 
 Jens Gyldenkærne Clausen
 Svar venligst under det du citerer, og citer kun det der er
 nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
 hvordan på http://usenet.dk/netikette/citatteknik.html |  |  | 
   Torben Brandt (17-12-2003) 
 
	
          | |  | Kommentar Fra : Torben Brandt
 | 
 Dato :  17-12-03 13:41
 | 
 |  | Jens Gyldenkærne Clausen skrev:
 > Torben Brandt skrev:
 >
 >>Ang. den tomme ordgrænse:
 >>  ^ matcher starten på strengen
 >>  $ matcher slutningen på strengen
 >>så hvis man indsatte dem, så ville man vel også have den tomme
 >>ordgrænse med i mængden...
 >
 > Du kan ikke bruge ^ og $ som tegn i en tegngruppe. Skriver man:
 
 Nææ, det kan man vist ikke. Du har ret :)
 
 mvh Torben
 
 
 
 |  |  | 
   Lars Hoffmann (17-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  17-12-03 22:43
 | 
 |  | Jens Gyldenkærne Clausen escribió / skrev
 
 > Skriver man i stedet:
 >
 >          ^[\s.,;\-<]test[\s.,;\->]$
 >
 > - vil det kun matche udtryk for f›rste tegn er et skilletegn, 2-5
 > tegn er "test" og sjette og sidste tegn igen er et skilletegn.
 
 Nix, den virker ikke. Den vil matche:
 "test"
 " test "
 "test."
 
 Men ikke
 "Dette er en test"
 
 det er fordi ^ og $ ikke er almideligt skildetegn, men derimod start og
 slut på strengen.
 Med venlig hilsen
 Lars Hoffmann
 
 
 |  |  | 
  Jens Gyldenkærne Cla~ (17-12-2003) 
 
	
          | |  | Kommentar Fra : Jens Gyldenkærne Cla~
 | 
 Dato :  17-12-03 23:30
 | 
 |  | 
 
            Lars Hoffmann skrev:
 >>          ^[\s.,;\-<]test[\s.,;\->]$
 > Nix, den virker ikke. 
 Det var sådan set også hvad jeg skrev    > Den vil matche:
 > "test"
 Nej.
 > " test "
 Ja.
 > "test."
 Nej.
 Ovenstående regex betyder ét skilletegn + ordet "test" + ét 
 skilletegn. Hverken mere eller mindre (her er skilletegn de tegn 
 der angives i klammerne).
 -- 
 Jens Gyldenkærne Clausen
 Svar venligst under det du citerer, og citer kun det der er 
 nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og 
 hvordan på http://usenet.dk/netikette/citatteknik.html |  |  | 
   Lars Hoffmann (17-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  17-12-03 23:44
 | 
 |  | 
 
            Jens Gyldenkærne Clausen escribió / skrev
 >> Nix, den virker ikke. 
 > 
 > Det var s†dan set ogs† hvad jeg skrev    > 
 Nå ok, så er vi jo enige. Jeg har i øvrigt brugt følgende løsning:
 [\s.,;\-<]test[\s.,;\->] omend det som sagt er nødvendigt at tilføje " 
 " til søgeteksten.
 [\s.,;\-<]test[\s.,;\->] har dog en ulempe fremfor \btest\b da jeg 
 bruger det i en replace. Når jeg replacer f.eks:
 "dette er en test streng"
 vil det med \btest\b være "test" der matcher og med [\s.,;\-<]test[\s.,;
 \->] vil det være " test " der matcher. Men den slags småting kan man 
 forøvrigt nemt programmere sig ud af.
 Jeg bruger det til den krydsreferede tekniske ordbog jeg er i gang med 
 og det virker supercool med masser af gode links imellem de forskelle 
 items i ordbogen.
            
             |  |  | 
  Jens Gyldenkærne Cla~ (18-12-2003) 
 
	
          | |  | Kommentar Fra : Jens Gyldenkærne Cla~
 | 
 Dato :  18-12-03 09:56
 | 
 |  | 
 
            Lars Hoffmann skrev:
 > [\s.,;\-<]test[\s.,;\->] har dog en ulempe fremfor \btest\b da
 > jeg bruger det i en replace. Når jeg replacer f.eks:
 >
 > "dette er en test streng"
 >
 > vil det med \btest\b være "test" der matcher og med
 > [\s.,;\-<]test[\s.,; \->] vil det være " test " der matcher.
 Har du overvejet at bruge [\s.,;\-<](test)[\s.,;\->] ?
 - så vil test ligge i $1 - klar til at blive manipuleret.
 -- 
 Jens Gyldenkærne Clausen
 Svar venligst under det du citerer, og citer kun det der er
 nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
 hvordan på http://usenet.dk/netikette/citatteknik.html |  |  | 
   Lars Hoffmann (18-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  18-12-03 10:37
 | 
 |  | 
 "Jens Gyldenkærne Clausen" <jens@gyros.invalid> escribió
 
 > - så vil test ligge i $1 - klar til at blive manipuleret.
 
 Det er netop den løsning jeg har brugt, ville blot gøre opmærksom på
 problematikken.
 
 
 
 
 |  |  | 
  Torben Brandt (17-12-2003) 
 
	
          | |  | Kommentar Fra : Torben Brandt
 | 
 Dato :  17-12-03 02:26
 | 
 |  | Lars Hoffmann skrev:
 > Jeg har et problem som jeg tror regEx kan løse for mig, Problemet er dog
 > at jeg ikke er så stiv til at skrive regex (faktisk kan jeg overhovedet
 > ikke finde ud af det).
 >
 > vi antager at jeg har en variable på nogenlunde denne måde:
 >  tekst = "en tekst <LINK:XX>linktekst</LINK>"
 > hvor XX er et vilkårligt heltal
 >
 > jeg ville gerne ved jeg af et regEx nå frem til:
 >  "en tekst linktekst"
 
 Jeg kommer lige lidt sent ind i tråden, men det ser ud til problemet
 ikke er helt løst endnu...
 
 Prøv dette:
 tekst = "et <LINK:1>flerliniers" & vbCrLf & "link</LINK> og" & _
 vbCrLf & "et <LINK:2>kort link</LINK>"
 Response.Write "<pre>" & Replace(tekst, "<", "<") & "</pre>"
 
 Set oRegEx = New RegExp
 oRegEx.Global = True
 oRegEx.Pattern = "<LINK:\d+>((\n|.)*?)</LINK>"
 tekst = oRegEx.Replace(tekst, "$1")
 
 Response.Write "<pre>" & Replace(tekst, "<", "<") & "</pre>"
 
 Linierne med Response.Write er ikke så pænt lavede, men det kan du nok
 se bort fra. Det er indholdet af 'tekst' der sker noget med.
 
 Lad mig lige sige lidt om det:
 - Punktum betyder alle tegn på nær linieskrift, så (\n|.) betyder alle tegn.
 - (\n|.)* : betyder så alle tegn nul eller flere gange. Dog er *
 'grådig' - dvs den matcher så mange tegn som muligt. Så får man dog
 problemer, fordi den matcher alt fra "flerliniers" til "kort link" i
 eksemplet herover. Det skal jo stoppe ved første </LINK> og kun matche
 "flerliniers link".
 - (\n|.)*? : Når man sætter et ? efter * så er den tilsyneladende ikke
 'grådig' mere - dvs den stopper så tidligt som muligt.
 Jeg så engang et eksempel med regular expressions i Perl og der gjorde
 man vist sådan, men jeg har ikke noget dokumentation for at det er det
 der sker, men det ser ud til virke...
 - $1 : Når man sætter parenteser ind i ens pattern, så huskes indholdet
 af dem. Og første parentes refererer man til med $1, den anden med $2
 osv. Da vi har sat parentes om alt mellem <LINK> og </LINK> så ligger
 den match i $1.
 
 
 En anden metode kunne også være at fjerne <LINK:XX> og </LINK> i to
 omgange. Det ville være væsentligt nemmere, men ikke så sjovt :)
 
 mvh Torben
 
 
 
 |  |  | 
  Lars Hoffmann (17-12-2003) 
 
	
          | |  | Kommentar Fra : Lars Hoffmann
 | 
 Dato :  17-12-03 10:17
 | 
 |  | 
 "Torben Brandt" <name@domain.invalid> escribió
 
 >   oRegEx.Pattern = "<LINK:\d+>((\n|.)*?)</LINK>"
 >   tekst = oRegEx.Replace(tekst, "$1")
 
 Supercool, Tricket med $1 løser også et andet problem jeg havde med regEx,
 så dobbelt tak til dig.
 Med venlig hilsen
 Lars Hoffmann
 
 
 
 
 |  |  | 
 |  |