正则表达式用空格替换非字母字符

我一直在尝试构建一个正则表达式,但无法使一个特定的条件工作。

我想要一个正则表达式删除所有非字母字符,但破折号( - )除外。 只有在以空格为前缀的情况下才应更换破折号。

 TEST-TEST -TEST#TEST.TEST 

应该改为

 TEST-TEST TEST TEST TEST 

我一直在使用[^a-zA-Z0-9]但未能包含一个OR条件init。

这是我提出的(\s-|[^A-Za-z0-9-]) …它将删除所有非字母数字但保留“ – ”除非它之前有空格“ – ”

在Linux中使用sed进行测试,此刻我无法访问VS或Mono以在C#中进行测试

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

产量

 TEST-TEST TEST TEST TEST 1234 
  • ()和| 用于OR条件
  • 我们首先使用\s-删除所有“ – ”
  • 接下来我们保留所有的字母数字和“ – ”与[^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); 

(?! – )是一个零宽度负前瞻断言,它将跳过’ – ‘符号……如果第二个组前面有一个空格,它将匹配它。

如果您尝试替换空格而不是完全删除字符,只需更改为

 string replacement = " "; 

模式是贪婪的,因此它将用单个空格替换非单词字符组。