Just nu i M3-nätverket
Jump to content

RegExp-problem


Sasja

Recommended Posts

Om man använder regExp på ungefär detta sätt:

strReplace = [GRÅ]"<font color="[/GRÅ][GRÅ]"red"[/GRÅ][GRÅ]">$1</font>"[/GRÅ]
objRegExp.Pattern = [GRÅ]"\[red\]([^\[\]]*)\[/redl\]"[/GRÅ]
str = objRegExp.[color="#0000ff"]Replace[/color](str, strReplace)

 

Och vill samtidigt att överallt i den inmatade strängen str som är "inringat" med [red] och [/red] så ska bokstaven a ersättas med bokstaven b.

 

Skulle alltså "vilja" ändra första raden till så här:

strReplace = [GRÅ]"<font color="[/GRÅ][GRÅ]"red"[/GRÅ][GRÅ]">"[/GRÅ] & [color="#0000ff"]Replace[/color]($1, [GRÅ]"a"[/GRÅ], [GRÅ]"b"[/GRÅ]) & [GRÅ]"</font>"[/GRÅ]

 

Vilket givetvis inte fungerar, visar det bara för att - förhoppningsvis - vara lite tydligare.

 

Given poäng till den som löser mitt problem!

 

[inlägget ändrat 2005-02-07 22:31:13 av Sasja]

Link to comment
Share on other sites

Den här är lite omständig kanske, men jag såg ingen väg runt det:

 

[color="#0000ff"]Function[/color] Sasjalize(strData)
[color="#0000ff"]Set[/color] regEx = [color="#0000ff"]New[/color] RegExp
regEx.IgnoreCase = [color="#0000ff"]True[/color]
regEx.Global= [color="#0000ff"]True[/color]
regEx.Pattern =[GRÅ]"(\[red\])([^\[]*)(\[/red\])"[/GRÅ]
[color="#0000ff"]Set[/color] Matches = regEx.[color="#0000ff"]Execute[/color](strData)
    [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] Match [color="#0000ff"]In[/color] Matches
	regEx.Pattern =[GRÅ]"(\[red\])([^\[]*)(\[/red\])"[/GRÅ]
	sInner=[color="#0000ff"]Replace[/color](regEx.[color="#0000ff"]Replace[/color](Match.Value,[GRÅ]"$2"[/GRÅ]),[GRÅ]"a"[/GRÅ],[GRÅ]"b"[/GRÅ])
    	sRet=sRet & regEx.[color="#0000ff"]Replace[/color](Match.Value,[GRÅ]"$1"[/GRÅ] & sInner & [GRÅ]"$3"[/GRÅ])
[color="#0000ff"]Next[/color]	
Sasjalize=sRet
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

 

Link to comment
Share on other sites

Kanske jag som är trött men jag ser inte hur Anjuna´s funktion ska kunna göra det som efterfrågas. Som gardering så har du ytterligare en regexpvariant: :)

[color="#0000ff"]Function[/color] Redmark(str)
[color="#0000ff"]Set[/color] objReg = [color="#0000ff"]New[/color] regexp
objReg.Global = [color="#0000ff"]True[/color]
objReg.IgnoreCase = [color="#0000ff"]True[/color]
objReg.Pattern=[GRÅ]"\[red\]([\w\W]*?)\[/red\]"[/GRÅ]
iSIndex = 1
iEIndex = 1
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] objMatch [color="#0000ff"]In[/color] objReg.[color="#0000ff"]Execute[/color](str)
iEIndex = objMatch.FirstIndex
sNew = sNew & [color="#0000ff"]Mid[/color](str, iSIndex, iEIndex-iSIndex+1)
sNew = sNew & [color="#0000ff"]Replace[/color](objMatch.Value,[GRÅ]"a"[/GRÅ],[GRÅ]"b"[/GRÅ])
sNew = objReg.[color="#0000ff"]Replace[/color](sNew,[GRÅ]"<font color="[/GRÅ][GRÅ]"red"[/GRÅ][GRÅ]">$1</font>"[/GRÅ])
iSIndex = iEIndex+objMatch.Length+1
[color="#0000ff"]Next[/color]
[color="#0000ff"]Set[/color] objReg = [color="#0000ff"]Nothing[/color]	
Redmark = sNew
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

 

Response.Write(Redmark("Kalle Karlsson [red]Kalle Karlsson[/red]"))

 

/OZn

_______________________________________________________

Microchips - De små potatisflingorna du äter allra sist i chipspåsen

[inlägget ändrat 2005-02-08 17:31:32 av OZn]

Link to comment
Share on other sites

Kanske jag som är trött men jag ser inte hur Anjuna´s funktion ska kunna göra det som efterfrågas.

 

Mitt förslag var lösning på hur jag tolkade första frågans problem:

överallt i den inmatade strängen str som är "inringat" med [red] och [/red] så ska bokstaven a ersättas med bokstaven b.

 

dvs. "test[red]abcaad[/red]testtest[red]abcd[/red]test" ska ge

"test[red]bbcbbd[/red]testtest[red]bbcd[/red]test"

 

Men jag kanske missförstod problemet?

 

(Dock ser jag att funktionen inte är helt korrekt, men jag struntar i att ändra i den tills jag vet vad som egentligen efterfrågades)

 

EDIT: Är också trött...

[inlägget ändrat 2005-02-08 17:34:13 av Anjuna Moon]

Link to comment
Share on other sites

Ja, jag vill ändra min kodsnutt helt enkelt.

 

Så här ser den ut nu:

 

Input:

abc-[red]abc[/red]-abc

 

som då får outputen:

abc-<font color="red">abc</font>-abc

 

Men jag vill ha den så här:

 

Input: (samma input som ovan)

abc-[red]abc[/red]-abc

 

som då ska få outputen:

abc-<font color="red">bbc</font>-abc

 

Det vill säga; Anjuna Moon förstod mig rätt som jag förstår det... =)

 

*delar ut lite poäng så ni blir pigga* :)

 

 

[inlägget ändrat 2005-02-08 18:03:03 av Sasja]

[inlägget ändrat 2005-02-08 18:03:33 av Sasja]

[inlägget ändrat 2005-02-08 18:05:09 av Sasja]

Link to comment
Share on other sites

Ett snabbt svar:

 

Ja

 

Det kan min funktion göra nu... alltså ska den göra det även efter modifikationen. Vill helt enkelt bara fixa till funktionen ytterligare. Även om fallet jag gett är riktigt skumt... men fallet jag har är naturligtvis inte så som ni ser det utan något helt annat. Varför jag gjort så dumt exempel är bara för att det ska bli lättare för andra att sätta in sig hade jag tänkt.

 

Kanske misslyckades jag. =)

 

[inlägget ändrat 2005-02-08 18:10:27 av Sasja]

Link to comment
Share on other sites

som då ska få outputen:

abc-<font color="red">bbc</font>-abc

Hehe, det är nog jag som är trött men är det inte det just vad min funktion gör? (missade en rad så jag postar koden igen)

 

[log]

[color="#0000ff"]Function[/color] Redmark(str)
[color="#0000ff"]Set[/color] objReg = [color="#0000ff"]New[/color] regexp
objReg.Global = [color="#0000ff"]True[/color]
objReg.IgnoreCase = [color="#0000ff"]True[/color]
objReg.Pattern=[GRÅ]"\[red\]([\w\W]*?)\[/red\]"[/GRÅ]
iSIndex = 1
iEIndex = 1
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] objMatch [color="#0000ff"]In[/color] objReg.[color="#0000ff"]Execute[/color](str)
iEIndex = objMatch.FirstIndex
sNew = sNew & [color="#0000ff"]Mid[/color](str, iSIndex, iEIndex-iSIndex+1)
sNew = sNew & [color="#0000ff"]Replace[/color](objMatch.Value,[GRÅ]"a"[/GRÅ],[GRÅ]"b"[/GRÅ])
sNew = objReg.[color="#0000ff"]Replace[/color](sNew,[GRÅ]"<font color="[/GRÅ][GRÅ]"red"[/GRÅ][GRÅ]">$1</font>"[/GRÅ])
iSIndex = iEIndex+objMatch.Length+1
[color="#0000ff"]Next[/color]
sNew = sNew & [color="#0000ff"]Mid[/color](str, iSIndex)
[color="#0000ff"]Set[/color] objReg = [color="#0000ff"]Nothing[/color]	
Redmark = sNew
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

[/log]

 

Response.Write(Redmark("abc-[red]abc[/red]-abc")) ger källkoden

abc-<font color="red">bbc</font>-abc

 

EDIT: Går och lägger mig nu :)

 

/OZn

_______________________________________________________

Microchips - De små potatisflingorna du äter allra sist i chipspåsen

[inlägget ändrat 2005-02-08 18:16:50 av OZn]

Link to comment
Share on other sites

Min funktion nu tillåter även valfri färgtagg:

 

[log]

[color="#0000ff"]Function[/color] Colorize(strData)
[color="#0000ff"]Set[/color] regEx = [color="#0000ff"]New[/color] RegExp
regEx.IgnoreCase = [color="#0000ff"]True[/color]
regEx.Global= [color="#0000ff"]True[/color]
regEx.Pattern =[GRÅ]"([^\[]*)\[([^\]]+)\]([^\[]*)\[/[^\]]+\]([^\[]*)"[/GRÅ]
[color="#0000ff"]Set[/color] Matches = regEx.[color="#0000ff"]Execute[/color](strData)
    [color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] Match [color="#0000ff"]In[/color] Matches
	sInner=[color="#0000ff"]Replace[/color](regEx.[color="#0000ff"]Replace[/color](Match.Value,[GRÅ]"$3"[/GRÅ]),[GRÅ]"a"[/GRÅ],[GRÅ]"b"[/GRÅ])
    	sRet=sRet & regEx.[color="#0000ff"]Replace[/color](Match.Value,[GRÅ]"$1<font color="[/GRÅ][GRÅ]"$2"[/GRÅ][GRÅ]">"[/GRÅ] & sInner & [GRÅ]"</font>$4"[/GRÅ])
[color="#0000ff"]Next[/color]	
Colorize=sRet
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]
[color="#006400"]' -------------------------------[/color]
[b]Response[/b].write Colorize([GRÅ]"A[red]a[/red]B--C[blue]a[/blue]D--"[/GRÅ])

[/log]

 

[inlägget ändrat 2005-02-08 18:22:01 av Anjuna Moon]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...