/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Erstatning af tegn
Fra : Christoffer


Dato : 07-03-07 15:38

Jeg har brug for lidt hjælp til at lave noget erstatning. Jeg vil gerne have
erstattet alle steder hvor tegnet forekommer en gang, men det skal ikke
erstattes hvis det står to gange i træk. Det kunne f.eks. være dette hvor
jeg gerne vil erstatte b med a, men altså ikke hvor der står bb eller bbb:

adefg bb f b ef b

Skal blive til:
adefg bb f a ef a

Med venlig hilsen Christoffer



 
 
Jens Gyldenkærne Cla~ (07-03-2007)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 07-03-07 18:28

Christoffer skrev:

> Jeg har brug for lidt hjælp til at lave noget erstatning. Jeg
> vil gerne have erstattet alle steder hvor tegnet forekommer en
> gang, men det skal ikke erstattes hvis det står to gange i
> træk. Det kunne f.eks. være dette hvor jeg gerne vil erstatte
> b med a, men altså ikke hvor der står bb eller bbb:

Regex er din ven. Du har brug for noget der kaldes "lookaround" -
som vbscript desværre kun understøtter halvt.

Følgende regex fungerer i .net, men ikke i vbscript:

1)    (?<!b)(b)(?!b)

Det matcher et b der hverken følger efter eller står før et andet
b.

I vbscript kan man lave følgende udgave:

2)    [^b](b)(?!b)

Det matcher et b der står efter noget der ikke er et b - og ikke
står før et andet b. Den lille forskel kan vises med et par
eksempler:

A) "a b c abc aabbcc"

B) "b c a abc aabbcc"

C) "a b c abc aabbcc b"


Når der skal erstattes, skal vi dog også have en reference til
tegnet før b:

3)    ([^b])(b)(?!b)


Strengen A giver ikke problemer i nogen af de to udtryk.

I B matcher regex nr 2 og 3 ikke det første b i strengen ikke (da
der jo ikke er et tegn som "ikke er b" før b'et. Regex 1 (der
desværre ikke fungerer i vbscript/asp) matcher korrekt.

C matches korrekt af begge udtryk - men er taget med for at
illustrere hvorfor man ikke bare skriver [^b](b)[^b] - gør man det,
bliver det sidste b heller ikke matchet.

Problemet med b'er forrest i sætningen kan dog løses i vbscript-
regex ved brug af ordgrænser (word boundary) - der for at gøre det
hele lidt sjovere skrives \b (b'et er her en specialkode - ikke et
normalt b).

Her følger et regex der ved første øjekast skulle kunne klare
opgaven:

4) \b(b)(?!b)|([^b])(b)(?!b)


Delingen fungerer bare ikke korrekt.


Du kan afprøve det her: http://gyros.dk/usenet/asp/regex.asp?r=1
- et lidt bedre forsøg er her:
<http://gyros.dk/usenet/asp/regex.asp?r=2>

Se mere om regex (regulære udtryk) her:
<http://www.regular-expressions.info>

Vender tilbage senere...
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

Erling (09-03-2007)
Kommentar
Fra : Erling


Dato : 09-03-07 13:28

"Jens Gyldenkærne Clausen" skrev

> Her følger et regex der ved første øjekast skulle kunne klare
> opgaven:
>
> 4) \b(b)(?!b)|([^b])(b)(?!b)
>
>
> Delingen fungerer bare ikke korrekt.

Øv.
Jeg kan ikke få din RegEx til at fejle.
Er der noget jeg overser?

/Erling



Christoffer (09-03-2007)
Kommentar
Fra : Christoffer


Dato : 09-03-07 17:32

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns98ECBBD4D83BFjcdmfdk@gyrosmod.dtext.news.tele.dk...
> Christoffer skrev:
>
> > Jeg har brug for lidt hjælp til at lave noget erstatning. Jeg
> > vil gerne have erstattet alle steder hvor tegnet forekommer en
> > gang, men det skal ikke erstattes hvis det står to gange i
> > træk. Det kunne f.eks. være dette hvor jeg gerne vil erstatte
> > b med a, men altså ikke hvor der står bb eller bbb:
>
> Regex er din ven. Du har brug for noget der kaldes "lookaround" -
> som vbscript desværre kun understøtter halvt.
>
> Følgende regex fungerer i .net, men ikke i vbscript:
>
> 1) (?<!b)(b)(?!b)
>

Tak for jeres svar, jeg fik lavet noget kode som virker. Jeg ved ikke rigtig
hvordan det der regex fungerer. Jeg synes det ser meget indviklet ud. Det
kan være det hjælper hvis jeg kigger lidt på de links du har postet.

Men her er den kode jeg fik lavet:

vartext = "badefg bb f b ef b"

'Tjek om tegnene før og efter er det samme.
'Hvis hverken før eller efter er det samme så udskift tegnet.

replacesign = "b"
replacewith = "a"

For i = 1 to len(vartext)

no_replace = 0

if mid(vartext,i,len(replacesign)) <> replacesign then
no_replace = 1
else
'tjek tegn før
if i-len(replacesign) > 0 then
if mid(vartext,i-len(replacesign),len(replacesign)) = replacesign then
no_replace = 1
end if
end if

'tjek tegn efter
if mid(vartext,i+len(replacesign),len(replacesign)) = replacesign then
no_replace = 1
end if
end if

if no_replace = 1 then
newtext = newtext & mid(vartext,i,1)
else
newtext = newtext & replacewith
i = i + len(replacesign)-1
end if

Next

response.write newtext

Med venlig hilsen Christoffer



Ukendt (08-03-2007)
Kommentar
Fra : Ukendt


Dato : 08-03-07 00:09

"Christoffer" skrev
> Jeg har brug for lidt hjælp til at lave noget erstatning. Jeg vil gerne
> have
> erstattet alle steder hvor tegnet forekommer en gang, men det skal ikke
> erstattes hvis det står to gange i træk. Det kunne f.eks. være dette hvor
> jeg gerne vil erstatte b med a, men altså ikke hvor der står bb eller bbb:
>
> adefg bb f b ef b
>
> Skal blive til:
> adefg bb f a ef a
>

Hmm.
Jeg ved ikke rigtig om det blev specielt pænt, men nedenstående skulle kunne
takle det.

str = "abc a b c aabbcc"
letter = "b"
new_letter = "a"
str_len= len(str)
previous = ""
modified_str = ""
for x = 1 to (str_len)
check_this = mid(str,x,1)
if check_this <> letter then
modified_str = modified_str & mid(str,x,1)
else
if previous = letter OR mid(str,(x+1),1) = letter then
modified_str = modified_str & mid(str,x,1)
else
modified_str = modified_str & new_letter
end if
end if
previous = check_this
next
response.write str & "<br>" & modified_str

/Erling



Søg
Reklame
Statistik
Spørgsmål : 177511
Tips : 31968
Nyheder : 719565
Indlæg : 6408599
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste