如何修剪空间?

时间:2019-04-05 07:38:07

标签: c# .net regex

我有一个字符串,它的开头和结尾都有空格。例如:

<para> This is a test paragraph </para>

现在我有一个正则表达式"(<\\w+[^<>\\/]*> | <\\/\\w+>)",可以找到><之间的任何起始和结尾空格。

因此,如果我在开头,结尾或两者之间都找到空格,我想对其进行修剪。

我该怎么做?

我想到了:

string mainstring = "<para> This is a test paragraph </para>";
string regex1 = "(<\\w+[^<>\\/]*> | <\\/\\w+>)";
string regex2 = "(<\\w+[^<>\\/]*>|<\\/\\w+>)";
mainstring = Regex.replace(mainstring, regex1, regex2);

但是这行不通。

此外,我的字符串包含多行。

string mainstring = "<para> This is a test paragraph </para>";
string regex1 = "(<\\w+[^<>\\/]*> | <\\/\\w+>)";
mainstring = Regex.replace(mainstring, regex1, "");

但这会删除所有找到的值,并将其替换为""

主要输入"<para> This is a test paragraph </para>"
预期的输出: "<para>This is a test paragraph</para>"

3 个答案:

答案 0 :(得分:2)

我认为最简单的方法是在标记之间提取文本,然后对该文本使用Trim()方法:

  var mainstring = "<para> This is a test paragraph </para>";
  // First index of >
  var start = mainstring.IndexOf(">") + 1;
  var prefix = mainstring.Substring(0, start);
  // Last index of <
  var end = mainstring.LastIndexOf("<") - 1;
  var suffix = mainstring.Substring(end + 1);
  mainstring = prefix + mainstring.Substring(start, end - start + 1).Trim() + suffix;

无需使用正则表达式

答案 1 :(得分:1)

您可以使用此正则表达式捕获标签和内部文本,而忽略标签前后的空格,

(<(\w+)>)\s*(.*?)\s*(<\/\2>)

并用\1\3\4替换所有内容,这将消除不必要的空间并保留其余空间。

\w对您来说不够用的情况下,您可以加宽标签的字符集,并可以使用[\w.-]之类的东西。

Demo

检查这些C# codes for demo

string pattern = @"(<(\w+)>)\s*(.*?)\s*(</\2>)";
string substitution = "$1$3$4";
string input = "<para> This is a test paragraph </para>";
Console.WriteLine("Before: " + input);
Regex regex = new Regex(pattern);
string result = regex.Replace(input, substitution);
Console.WriteLine("After: " + result);

打印

Before: <para> This is a test paragraph </para>
After: <para>This is a test paragraph</para>

答案 2 :(得分:1)

在要保留的零件上使用capturing groups(以替换图案替换为backreferences),然后\s+删除空白:

string mainstring = "<para> This is a test paragraph </para>";
string regex1 = @"(<\w+[^<>/]*>)\s+|\s+(</\w+>)";
mainstring = Regex.Replace(mainstring, regex1, "$1$2");
Console.WriteLine(mainstring);

请参见C# demo

详细信息

  • (<\w+[^<>/]*>)\s+-第1组($1):<,1个以上的字符字符,<>,{{ 1}}(注意,您不必在.NET正则表达式中转义/),然后转义/,然后转义该组之外的1+个空格
  • >-或
  • |-超过1个空格
  • \s+-第2组((</\w+>)):$2,1个以上的字符字符和一个</

这里是.NET regex demo

enter image description here