parser agility c# special-characters

agility - html parser c#



C#Eliminar caracteres especiales (7)

Así es como se vería mi versión.

StringBuilder sb = new StringBuilder(); foreach (char c in input) { if (Char.IsLetterOrDigit(c) || c == ''.'' || c == ''_'' || c == '' '' || c == ''%'') sb.Append(c); } } return sb.ToString();

Quiero eliminar todos los caracteres especiales de una cadena. Los caracteres permitidos son AZ (mayúsculas o minúsculas), números (0-9), subrayado (_), espacio en blanco (), porcentaje (%) o el signo de punto (.).

He intentado esto:

StringBuilder sb = new StringBuilder(); foreach (char c in input) { if ((c >= ''0'' && c <= ''9'') || (c >= ''A'' && c <= ''Z'') || (c >= ''a'' && c <= ''z'') | c == ''.'' || c == ''_'' || c == '' '' || c == ''%'') { sb.Append(c); } } return sb.ToString();

Y esto:

Regex r = new Regex("(?:[^a-z0-9% ]|(?<=[''/"])s)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled); return r.Replace(input, String.Empty);

Pero nada parece estar funcionando. Cualquier ayuda será apreciada.

¡Gracias!


Convierta cada char en un int, luego compare su código ascii con la tabla ascii, que puede encontrar en Internet: http://www.asciitable.com/

{ char[] input = txtInput.Text.ToCharArray(); StringBuilder sbResult = new StringBuilder(); foreach (char c in input) { int asciiCode = (int)c; if ( //Space asciiCode == 32 || // Period (.) asciiCode == 46 || // Percentage Sign (%) asciiCode == 37 || // Underscore asciiCode == 95 || ( //0-9, asciiCode >= 48 && asciiCode <= 57 ) || ( //A-Z asciiCode >= 65 && asciiCode <= 90 ) || ( //a-z asciiCode >= 97 && asciiCode <= 122 ) ) { sbResult.Append(c); } } txtResult.Text = sbResult.ToString(); }


El primer enfoque parece correcto, excepto que tienes un | (OR en modo bit) en lugar de un || antes de c == ''.'' .

Por cierto, debe indicar qué no funciona (¿no se compila, o se bloquea, o produce una salida incorrecta?)


Puedes simplificar el primer método para

StringBuilder sb = new StringBuilder(); foreach (char c in input) { if (Char.IsLetterOrDigit(c) || c == ''.'' || c == ''_'' || c == '' '' || c == ''%'') { sb.Append(c); } } return sb.ToString();

Lo que parece pasar pruebas sencillas. Puedes acortarlo usando LINQ

return new string( input.Where( c => Char.IsLetterOrDigit(c) || c == ''.'' || c == ''_'' || c == '' '' || c == ''%'') .ToArray());


private string RemoveReservedCharacters(string strValue) { char[] ReservedChars = {''/'', '':'',''*'',''?'',''"'', ''<'', ''>'', ''|''}; foreach (char strChar in ReservedChars) { strValue = strValue.Replace(strChar.ToString(), ""); } return strValue; }


Regex.Replace(input, "[^a-zA-Z0-9% ._]", string.Empty)


StringBuilder sb = new StringBuilder(); foreach (char c in input) { if (char.IsLetterOrDigit(c) || "_ %.".Contains(c.ToString())) sb.Append(c); } return sb.ToString();