创建正则表达式以删除除换行符之外的连续空白

时间:2019-03-03 15:35:46

标签: c# regex string whitespace

我想使用正则表达式执行以下操作:

  • 除换行符外的所有空白字符都必须转换为空格(即\f\r\t\v将转换为空格)
  • 除了换行符,字符串不能有两个或多个连续的空格。
    • 换行符最多只能连续出现两次(即\n可以,\n\n也可以,但是\n\n\n不允许,应该用\n\n代替)。
  • 如果在空格前后加上换行符,则应删除该空格。

一些例子:

space-space => space
space-space-space => space
space-tab => space
space-tab-space => space
newline-newline => newline-newline
space-newline => newline
space-newline-newline => newline-newline
newline-space => newline
newline-space-newline => newline-newline

到目前为止,我唯一能想到的正则表达式是它,它正在删除所有连续的空格:

Regex.Replace(input, @"(\s)\s+", "$1");

2 个答案:

答案 0 :(得分:1)

要匹配除换行符以外的任何空格,可以使用children否定字符类。或者,Props,但我更喜欢第一个,因为它可以移植到其他正则表达式引擎中。

现在,您可以使用一个正则表达式,该表达式将在除换行符之外的1+个空格的左侧和右侧匹配可选的换行符。然后,您可以检查是否有任何换行符被匹配,如果是,则省略匹配的空格,否则,用空格替换匹配项。然后,您将需要用两个换行符替换3个或更多换行符的任何块。

React.ComponentType

详细信息

  • Instance-捕获第1组:可选换行符
  • [^\S\n]-除换行符外的1+个空格
  • [\s-[\n]]-捕获第2组:可选的换行符
  • var result = Regex.Replace(input, @"(\n?)[^\S\n]+(\n?)", m => !string.IsNullOrEmpty(m.Groups[1].Value) || !string.IsNullOrEmpty(m.Groups[2].Value) // If any \n matched ? $"{m.Groups[1].Value}{m.Groups[2].Value}" // Concat Group 1 and 2 values : " "); // Else, replace the 1+ whitespaces matched with a space var final_result = Regex.Replace(result, @"\n{3,}", "\n\n"); // Replace 3+ \ns with two \ns -3个或更多换行符。

答案 1 :(得分:0)

一个简单的多步骤解决方案如下:

  

除换行符外的所有空白字符都必须转换为空格(即\ f,\ r,\ t,\ v将转换为空格)

output = Regex.Replace(input, "[\\f\\r\\t\\v ]+", " ");

上面的组中包含一个空格。

  

如果在空格前后加上换行符,则应删除该空格。

output = Regex.Replace(output, " \n", "\n");
output = Regex.Replace(output, "\n ", "\n"); 

以上两种可以改为使用String.Replace风格:

output = output.Replace(" \n", "\n");
output = output.Replace("\n ", "\n");

甚至:

output = output.Replace(" \n", "\n").Replace("\n ", "\n");
  

除了换行符,字符串不能有两个或多个连续的空格。   换行符最多只能连续出现两次(即\ n可以,\ n \ n也可以,但是\ n \ n \ n不允许,应该用\ n \ n代替)。

output = Regex.Replace(output, "\n\n\n+", "\n\n");

顺便说一句。如果系统将\r\n用于换行符,则抑制\r字符可能会导致不良结果。