Er performance vigtig? For når jeg ikke ved mere om det end hvad du skriver, er det sikreste at bruge en "lazy quantifier", men det går ud over performance, men her er et regex der opfylder dine umiddelbare krav:
(?<=<).+?:|/.+?:|(?<=xmlns):.+?(?==)
Vil du gerne have en lidt mere forståelig variant er den her med kommentarerer (som også kan køres i stedet for ovenstående, hvis du slår "Ignore Whitespace" til):
#regex start: #part 1: (?<=<) #Match '<', men inkluder det ikke. .+?: #Match så lidt som muligt, indtil du når til ':'.
#part 2: | /.+?: #Match '/ ' efterfulgt af så lidt som muligt, indtil du når til ':'.
#part 3: | (?<=xmlns) #Match 'xmlns', men inkluder det ikke. :.+? #Match ':' efterfulgt af så lidt som muligt. (?==) #Match '=' men inkluder det ikke. #regex slut
Det ser lækkert ud. Jeg har ikke prøvet det endnu. Det skal helst performe godt, det er en meget dum rettelse, og går i virkeligheden på at servicere nogle kunder, der ikke kan modtaget namespace prefixes på det xml vi sender. Derfor skal jeg bare fjerne namespace prefixes, og det skal gå relativt hurtigt. :)
Jeg kan se at mine første regelsæts forklaringer, faktisk ikke var nok, da jeg sidder selv og fanger små undtagelser.
Min xml streng ser således ud: <?xml version="1.0" encoding="utf-8"?><ns0:MineXmlData xmlns:ns0="http:/ /google/schemas/minedata"><ns0:Personer></ns0:Personer></ns0:MineXmlData>
Denne giver mig: <?xml version="1.0" encoding="utf-8"?><ns0:MineXmlData xmlns="http:/ /google/schemas/minedata"><ns0:Personer></ns0:Personer></ns0:MineXmlData>
Så den retter fint xmlns, men mangler, det der står i start og slut tags som prefixes.
(i stedet for at tage alt ind til næste tegn, så tager jeg nu alt det jeg kan, men kun hvor der ikke er tale om apostroffer, whitespaces, samt tegnene '>' og '<'.)
Den virker fint i Expresso, som jeg bruger til Regexp, men ved tildeling af i .net regexp brokker den sig over formatet. Har forsøgt at escape " men det hjælper ikke :(
Jeg går ikke så meget op i points, så det skal du ikke tænke på. :)
Hvilken fejl får du præcist? For det er ikke bare fordi du mangler @ foran dit regexp pattern: Regex.Replace(@"(?<=<)[^""\s<>]+:|/[^""\s<>]+:|(?<=xmlns):[^""\s<>]+(?==)", "");
Det skal lige siges, at det er bedre at lave en instans af Regex hvor du bruger "Compiled" option'en.
Angående din, så vil jeg tro den er ok, medmindre du f.eks. laver namespaces med '_' i (det kan jeg ikke lige huske på stående fod huske om XML tillader). Derudover er der også lige sneget sig to fejl ind:
(fjernede et plus der ikke var der [som heller ikke rigtig gjorde noget, da det kun ville få effekt ved invalid xml], og så satte "[a-zA-Z0-9]+" ind i stedet for et ".+?")
Hvis du vil være lidt mere sikker på at at det går godt, kan du jo evt. lige bygge din regex op, efterhånden som du opdager at der skal tilføjes flere karakterer, hvis det er tilfældet:
var regex = new Regex(pattern, RegexOptions.Compiled);
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.