Expresión regular para reemplazar caracteres no alfa con espacios

He estado tratando de construir una expresión regular pero no he podido lograr que funcione una condición específica.

Quiero una expresión regular para eliminar todos los caracteres no alfa con la excepción de guión ( - ). Los guiones solo deben reemplazarse si están precedidos por un espacio.

Es decir

 TEST-TEST -TEST#TEST.TEST 

debe ser cambiado a

 TEST-TEST TEST TEST TEST 

Había estado usando [^a-zA-Z0-9] pero no he podido incluir una condición OR de init.

Esto es lo que se me ocurrió (\s-|[^A-Za-z0-9-]) … Se eliminarán todos los caracteres no alfanuméricos, pero se conservará el “-“, excepto si hay un espacio delante de él “-”

Prueba usando sed en Linux, por el momento no tengo acceso a VS o Mono para probar en C #

 echo "TEST-TEST -TEST#TEST.TEST -1234" | sed 's/\(\s-\|[^A-Za-z0-9-]\)/ /g' 

Salida

 TEST-TEST TEST TEST TEST 1234 
  • () y | se utilizan para la condición OR
  • Primero eliminamos todos “-” usando \s-
  • [^A-Za-z0-9-] mantenemos todos los caracteres alfanuméricos y “-” con [^A-Za-z0-9-]
 // Skip over '-', grab non-word characters or the ' -' sequence to replace string pattern = @"(?!-)(\W| -)+"; string replacement = ""; Regex regex = new Regex(pattern); string result = regex .Replace("Replace - this *@#&@#* string-already", replacement); 

La (?! -) es una afirmación de búsqueda anticipada negativa de ancho cero que omitirá el símbolo ‘-‘ … el segundo grupo coincidirá si está precedido por un espacio.

Si está intentando sustituir un espacio en lugar de eliminar completamente los caracteres, simplemente cambie a

 string replacement = " "; 

el patrón es codicioso, por lo que reemplazará grupos de caracteres que no sean de palabras con un solo espacio.