21. oktober 2005 - 11:31Der er
39 kommentarer og 1 løsning
Regex der ikke dur
Jeg har fået følgende:
return Regex.IsMatch(s, @"^\"[^\"]*\"$");
Men, jeg får en fejl når @ står der, og hvis jeg sletter den, virker det ikke - dvs. at den finder ikke noget tekst i "" og gør så ikke det efterfølgende den skal.
Så, hvordan laver jeg en regex der fanger tekst der står i "" som f.eks.: "Hej med dig, her står noget tekst i gåseøjne"
hmm når jeg tjekker på sb.ToString() ( bool text = IsText(sb.ToString());) siger den bare at text er false - og jeg ved at der er tekst der står i "". Tjekker jeg på noget forkert?
mærkeligt - kan jo godt se at den regex du har sendt mig passer.... Men hvorfor får jeg ikke fat i mine "" i min tekst. Tjekker jeg på det forkerte når jeg vælger at sige at bool text = IsText(dr[dc].ToString());
Jeg har prøvet nu med sb.ToString, og brugt metoden public static bool ContainsText(string s) { return Regex.IsMatch(s, "\\\"[^\\\"]*\\\""); } Og nu kan den godt umiddelbart godt finde tekst der er inde i " ". Je gskal lige se hele filen når den er færdig...
Hmmm, den får godt nok fundet de tekster der er " ", men den fjerner også \n (jeg erstatter \n med \ ) udenfor "", den skal kunne fjerne dem der forekommer indenfor gåseøjne: eks. taget fra filen:
Nej nej, det var dårligt formuleret, men den fanger noget tekst der står i " " og af en eller anden grund får den så også fat på det der står efter "" (rigtigt forstået?). Når ContainsText er true, skal den fjerne linie skift, dette gør jeg således:
bool text = MatchRegex.IsText(sb.ToString()); if(text) { //Fjerne "tvunget" linjeskif sb.Replace("<br>","\\"); //Udkift linkeskift med en tegnkombination \ sb.Replace("\n", "\\"); sb.Replace("\r\n", "\\"); }
Kan jeg få dig til at tilpasse ovenstående kode til denne?
public void Iterate(object obj, out string position) { DataRow dr=(DataRow)obj;
foreach (DataColumn dc in dr.Table.Columns) { bool needtoquote = !MatchRegex.IsNumber(dr[dc].ToString()); bool date = MatchRegex.IsDate(dr[dc].ToString());
bool text = MatchRegex.IsText(sb.ToString()); if(text) { //Fjerne "tvunget" linjeskift sb.Replace("<br>","\\"); //Udkift linkeskift med en tegnkombination sb.Replace("\n", "\\"); //slet carriage return \r
} public class MatchRegex { public static bool IsNumber(string s) { return Regex.IsMatch(s, "^[0-9]+$"); } public static bool IsDate(string s) { return Regex.IsMatch(s, "^[0-9]{2}-[0-9]{2}-[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}$"); } public static bool IsText(string s) { return Regex.IsMatch(s, "\\\"[^\\\"]*\\\""); } } position="0"; } Det vil bare være helt kanon :)
Det tog 1½ time, og da jeg kiggede i filen, var ingen af \n blevet erstattet med \. Så kan det passe at det er det rigtige jeg gør når jeg har skrevet XReplace(sb.ToString(), '\n', '\\');
Er det sb det skal sættes som strengen? Eller er det fordi at det er den forkerte sted jeg sætter det ind (efter foreach)?
foreach (DataColumn dc in dr.Table.Columns) { bool needtoquote = !MatchRegex.IsNumber(dr[dc].ToString()); bool date = MatchRegex.IsDate(dr[dc].ToString());
Jeg vil bruge den replace idet jeg skriver filen, før den bliver gemt. Det er det der sker i den kode jeg har vedhæftet. Replacen skal som skrevet kun ske i tekststrenge der er i "", og den tekst det drejer sig om ligger i sb (som har en append, hvor jeg kan tilføje ting til teksten). Teksten kommer fra en database og bliver skrevet til en tekstfil.
Evt. kan replacen ske efter at alle rækker i databasen er kørt igennem og ligger som tekst i sb. Hvilket var derfor at jeg ville gøre det efter foreach.
Jeg forstår ikke helt hvordan jeg skal bruge XReplace som du har givet mig....
nu har jeg prøvet at bruge XReplace på følgende måde:
DataRow dr=(DataRow)obj;
foreach (DataColumn dc in dr.Table.Columns) { bool needtoquote = !MatchRegex.IsNumber(dr[dc].ToString()); bool date = MatchRegex.IsDate(dr[dc].ToString());
string tekst = XReplace(dr[dc].ToString(), '\n', '#');
foreach (DataColumn dc in dr.Table.Columns) { bool needtoquote = !MatchRegex.IsNumber(dr[dc].ToString()); bool date = MatchRegex.IsDate(dr[dc].ToString());
Ahh jeg har fundet ud af hvorfor. Det er et kommentar felt hvori jeg vil fjerne \n, og her har en skrevet "" inde i feltet, derfor brydes flowet med de rigtige "", så den skal vel faktisk tjekke på om "" er efterfult af et ; for at tekststrengen er slut, altså f.eks. "fgggd sss "her har brugeren skrevet noget i gåseøjne" fff sss";
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.