webForumDet fria alternativet

C# - Ta ut /xxx/ med regexp

.NET

16 svar · 1 876 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej,

Sitter med en Dotnetnukeportal och skriver ut en meny med följande kod:

void WriteContainer(StringBuilder sb, PageInfo page) {
	foreach(PageInfo subpage in page.Childs) {
		sb.Append("<li><a href=\"" + subpage.Url + "\" >" + subpage.Name + "</a></li>\n");
	}		
}

subpage.Url är sökvägen till den sidan och kan t.ex. se ut såhär:

/Page1/Subpage1/tabid/123/Default.aspx

Jag vill nu ta ut 123 från strängen ovan med t.ex. RegExp, men vet inte alls hur jag ska göra.

Anledningen är att jag ska skriva ut bilder för varje Item och vill döpa dom till 123.jpg (alltså baserat på Id't).

Det finns inga funktioner för att plocka ID direkt, det har jag kolllat, så det här är enda sättet att fixa det här på.

Tacksam för lite hjälp.

Medlem sedan mars 20007 896 inlägg
#2

Det beror lite på. Är det alltid tresiffriga ID-nummer? Finns det andra sekvenser i subpage.Url som kan ha lika många siffror som ID-numret?
Det enklaste är:

using System.Text.RegularExpressions;
...
    Regex re = new Regex(@"\d{3}");
    Int32 id = Int32.Parse(re.Matches(subpage.Url)[0].Value);
...

Det förutsätter dock att inga andra talserier om tre tecken kan förekomma i strängen och att id-numret alltid är tre siffor långt.

Annars kan man ju arbeta runt det;

using System.Text.RegularExpressions;
...
    Regex re = new Regex(@"/\d{1,6}/");
    string result = re.Matches(subpage.Url)[0].Value;
    Int32 id = Int32.Parse(result.Substring(1, result.Length - 2));
...

Nu plockar den bara ut nummer ur strängen som omgärdas av / - och är mellan 1 och 6 tecken långa.

Det kan också vara bra att se till så att det verkligen fanns träffar, genom att kolla att re.Matches(subpage.Url).Count > 0.

Medlem sedan feb. 20034 441 inlägg
#3

Det jag vill göra är att plocka ut alla mellan /tabid/ och /Default.aspx. ID't är tresiffrigt just nu men kan vara från 1 siffra och uppåt.

Hur ska mönstret se ut för att ta ut allt mellan /tabid/ och /Default.aspx?

Tack!

Medlem sedan mars 20007 896 inlägg
#4

Då kan vi göra så här:

using System.Text.RegularExpressions;
...
    Regex re = new Regex(@"/tabid/(\d*)/");
    Int32 result = Int32.Parse(re.Match(subpage.Url).Groups(1).Value);
...
Medlem sedan feb. 20034 441 inlägg
#5

Det kan hända att en länk ser ut såhär:

/myPage/100Bonus/tabid/123/Default.aspx

Isåfall funkar inte det övre exemplet (som du säger) men det andra kör jag på nu och det funkar.
Om man kunde plocka ut allt mellan /tabid/ och /Default.aspx så skulle det vara idiotsäkert, eller hur?

Medlem sedan mars 20007 896 inlägg
#6

Det gör jag ju i mitt sista exempel. :) (och, ja, det bör vara idiotsäkert. ;))

Medlem sedan mars 20007 896 inlägg
#7

Jag tycker att du markerar fel svar. Mitt sista exempel;

using System.Text.RegularExpressions;
...
    Regex re = new Regex(@"/tabid/(\d*)/");
    Int32 result = Int32.Parse(re.Match(subpage.Url).Groups(1).Value);
...

...är det bättre av dem. Då kan id-numret innehålla hur många tecken som helst och den går enbart efter adresser med tabid som föräldra-mapp.

Medlem sedan feb. 20034 441 inlägg
#8

Oj, sorry, såg inte det inlägget igår. Givetvis är det det rätta svaret.
En sak bara... var ska using System.Text.RegularExpressions; ligga? Var jag än lägger det så får jag ett felmeddelande, tar jag bort det funkar allt som det ska.

Medlem sedan feb. 20034 441 inlägg
#9

SPiN skrev:

Jag tycker att du markerar fel svar. Mitt sista exempel;

using System.Text.RegularExpressions;
...
    Regex re = new Regex(@"/tabid/(\d*)/");
    Int32 result = Int32.Parse(re.Match(subpage.Url).Groups(1).Value);
...

...är det bättre av dem. Då kan id-numret innehålla hur många tecken som helst och den går enbart efter adresser med tabid som föräldra-mapp.

Då får jag:

Non-invocable member 'System.Text.RegularExpressions.Match.Groups' cannot be used like a method
Medlem sedan mars 20007 896 inlägg
#10

using System.Text.RegularExpressions bör ligga vid alla andra namnrymds-referenser. Det kan vara så att det inte behövs i VS.NET, men jag sitter på Mono - och där är man illa tvungen att importera den namnrymden.

Likaså verkar det fungera lite olika med Group/GroupCollection-klasserna. Om du byter parenteserna mot hakparenteser - fungerar det bättre då?

Int32 id = Int32.Parse(re.Match(subpage.Url).Groups[1].Value);
Medlem sedan juni 20011 732 inlägg
#11

Groups är inte en metod utan du ska plocka ut något mha av ett index... alltså borde det vara:

Int32.Parse(re.Match(subpage.Url).Groups[B][1][/B].Value);
Medlem sedan feb. 20034 441 inlägg
#12

SPiN skrev:

Om du byter parenteserna mot hakparenteser - fungerar det bättre då?

Japp!

Tack ska du ha.

Medlem sedan feb. 20034 441 inlägg
#13

Nu har jag en liknande fråga. Min URL ser ut såhär:

/myPage/100Bonus/tabid/123/[b]language/en-US/[/b]Default.aspx

.

Jag ska nu ersätta en-US med något annat, t.ex. sv-SE eller zh-CN. Finns det någon motsvariget till PHP's preg_replace()?

Bör bli något likt det här:

Regex re = new Regex(@"/language/(\w{2}-\w{2})/");

Men hur gör man en replace av det?

Tack!

Medlem sedan juni 20011 732 inlägg
#14

Det finns en replace-metod på regexp-objektet... men kan du inte bara använda en vanlig string replace i det här fallet?

string url = "/myPage/100Bonus/tabid/123/language/en-US/Default.aspx";
url = url.Replace("en-US", "Valfri text");
Medlem sedan feb. 20034 441 inlägg
#15

Hmm, jag måste kombinera det med någon typ av regexp, eftersom ibland är det en-US som ska bytas mot något, men när någon är på t.ex. Kinesiska så ska ju zh-CN bytas mot t.ex. sv-SE.

Så jag måste plocka ut /language/en-US/Default.aspx, ersätta det som regexp har returnerat och ersätta det.

Medlem sedan dec. 20025 483 inlägg
#16
str = Regex.Replace(str, "language/\w{2}-\w{2}", "language/sv-SE")
Medlem sedan feb. 20034 441 inlägg
#17

Aha, ska titta på det här. Tack!

255 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)