Jeg vil fjerne alle spesialtegn fra en streng. Tillatte tegn er A-Z (store eller små bokstaver), tall (0-9), understrek (_) eller punktum (.).
Jeg har følgende, det fungerer, men jeg mistenker (jeg vet!) at det ikke er veldig effektivt:
public static string RemoveSpecialCharacters(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
if ((str[i] >= '0' && str[i] <= '9')
|| (str[i] >= 'A' && str[i] <= 'z'
|| (str[i] == '.' || str[i] == '_')))
{
sb.Append(str[i]);
}
}
return sb.ToString();
}
Hva er den mest effektive måten å gjøre dette på? Hvordan vil et regulært uttrykk se ut, og hvordan er det sammenlignet med vanlig strengmanipulering?
Strengene som skal renses vil være ganske korte, vanligvis mellom 10 og 30 tegn lange.
Vel, med mindre du virkelig trenger å presse ytelsen ut av funksjonen din, er det bare å gå med det som er enklest å vedlikeholde og forstå. Et vanlig uttrykk vil se slik ut:
For ekstra ytelse kan du enten pre-kompilere den eller bare be den om å kompilere ved første anrop (påfølgende anrop vil være raskere.)
public static string RemoveSpecialCharacters(string str)
{
return Regex.Replace(str, "[^a-zA-Z0-9_.]+", "", RegexOptions.Compiled);
}
Jeg foreslår at du oppretter en enkel oppslagstabell, som du kan initialisere i den statiske konstruktøren for å sette en hvilken som helst kombinasjon av tegn til gyldig. Dette lar deg gjøre en rask, enkel sjekk.
rediger
For hastighet, vil du også ønske å initialisere kapasiteten til StringBuilder til lengden på inndatastrengen. Dette vil unngå reallokeringer. Disse to metodene sammen vil gi deg både hastighet og fleksibilitet.
en annen redigering
Jeg tror kompilatoren kan optimalisere det ut, men som et spørsmål om stil så vel som effektivitet, anbefaler jeg foreach i stedet for for.