Jeg ved ikke om man kan påstå at det er smartere, men det kan også løses vha. regulære udtryk:
using System; using System.Text.RegularExpressions;
namespace Eksperten { class Class1 { [STAThread] static void Main(string[] args) { string Source = "Det er kun den første forekomst af ordet Alpha som skal erstattes med Beta - ikke den anden forekomst af Alpha. Nemlig, ja!"; string Pattern = "(.*?)Alpha(.*)"; Regex RE = new Regex(Pattern); string Target = RE.Replace(Source, @"$1Beta$2");
"static" har i dette tilfælde intet som helst at gøre med løsningen på problemet. Main-metoden skal simpelthen bare altid være erklæret som static. :^)
Det er den første forekomst af ordet "Alpha" som bliver erstattet med ordet "Beta" - den anden forekomst bliver ved med at være "Alpha". Prøv at kør koden så ser du det selv.
Ok, en meget kort tutorial om regulære udtryk:
Det centrale i er RegExp er et "mønster" - det er dette som jeg har i min variabel Pattern. I dette tilfælde er Pattern altså:
(.*?)Alpha(.*)
Sætningen:
Regex RE = new Regex(Pattern);
- opretter et RegExp baseret på dette monster.
Når noget er omgivet med parenteser så er det fordi vi vil huske det til senere. I dette tilfælde er det altså noget før ordet "Alpha", samt noget efter det, som vi vil huske. Mere om det der står inden i parenteserne lige om lidt.
Senere når vi skal huske det igen så huskes værdien fra den første parentes som $1 og den anden parentes som $2. Der er disse to som du ser i 2. argument i Replace() funktionen.
string Target = RE.Replace(Source, @"$1Beta$2");
(Tegnet '@' kan i øvrigt slettes igen - det var en fejl.)
Replac'en fungere i dette tilfælde sådan her.
"Den nye streng skal være lig med det som vi huskede fra *før* Alpha + ordet Beta + det vi huskede fra *efter* Alpha."
Tilbage til det som stod indenfor i parenteserne: ".*?" og ".*".
Den sidste først: Et punktum betyder "et vilkårligt tegn" og en asterisk ('*') betyder "0-eller-flere". Derfor betyder ".*" det samme som "0-eller-flere-vilkårlige-tegn".
Normalt er ".*" delmønsteret "grådigt" i den forstand at det forsøger at matche så meget som det overhovedet kan. Hvis mit mønster havde set sådan her ud:
(.*)Alpha(.*)
- ville den første parentes have forsøgt at matche alt det den kunne og derfor havde den husket alt op til Alpha nr. 2. Vil ville imidlertid kun hvad den til at matche alt på til før det første Alpha! Derfor fortæller vi den at den ikke skal være grådig - at den skal være "doven" ("lazy"). Det er det som spørgsmålstegnet i det første delmønster står for.
Anyways, her er RegExp-versionen af Arne_v's ReplaceOne:
using System; using System.Text.RegularExpressions;
namespace Eksperten { class Class1 { [STAThread] static void Main(string[] args) { string Source = "Det er kun den første forekomst af ordet Alpha som skal erstattes med Beta - ikke den anden forekomst af Alpha. Nemlig, ja!";
content = "abcdefghi" vi vil erstatte "cde" med "xyzw" ix bliver så 2 content.Substring(0, ix) er "ab" newUrl er "xyzw" content.Substring(ix + orginalUrl.Length) er "fghi" så resultatet blivet "abxyzwfghi"
1 ) man har ab 2 ) så lægger man xyzw til ab så er streng vel abxyzw 3 ) så nu er den abxyzw, men så siger du så content.Substring(ix + orginalUrl.Length) dvs. 2+hele strengen så burden den da starte efter ab igen ? eller står man et andet sted i strengen (sorf of curser) og hvordan ved den det
Gab det er da lidt tricky, den er vist ikke rigtigt landet på øverste etage hos mig endnu altså det der med substring og hvornår det trækkes ud...........
Tak for hjælpen i 2, helt perfekt. Jeg brugte Arne_v løsning..... :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.