|
| 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
| |
|
|