【问题标题】:How do I trim spaces?如何修剪空间?
【发布时间】:2019-04-05 07:38:06
【问题描述】:

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

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

现在我有一个正则表达式 "(&lt;\\w+[^&lt;&gt;\\/]*&gt; | &lt;\\/\\w+&gt;)" 可以找到 &gt;&lt; 之间的任何开始和结束空格。

所以,如果我在开头或结尾发现任何空格,或者两者都有,我想修剪它。

我该怎么做?

我想到了:

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, "");

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

主要输入: "&lt;para&gt; This is a test paragraph &lt;/para&gt;"
预期输出: "&lt;para&gt;This is a test paragraph&lt;/para&gt;"

【问题讨论】:

  • 如果在打开标签之后有换行符,或者在关闭标签之前有换行符,您要删除它们吗?
  • 那么,你所有的标签都是配对的,从不嵌套?

标签: c# .net regex


【解决方案1】:

我认为最简单的方法是提取标签之间的文本,然后对该文本使用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;

无需使用正则表达式

【讨论】:

  • 它似乎不起作用,因为它吞噬了第一个&gt;,请参阅ideone.com/JxXjiF
  • @WiktorStribiżew 谢谢,你是对的 :) 更正
【解决方案2】:

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

(<(\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>

【讨论】:

  • 它用“\1\3\4”替换了所有值。在 regex101.com 中,输出是完美的,但是在用 C# 编写相同的内容时,它并没有按预期进行。
  • 在 C# 中使用 $1 而不是 \1,我添加了一个 C# 代码演示。希望对您有所帮助。
  • 只是为了让它更简洁:当您不打算使用字符串转义序列时,逐字字符串文字很好。此外,/ 不是特殊的正则表达式字符,.NET 正则表达式不使用正则表达式分隔符。
  • @PushpeshKumarRajwanshi - 它替换了大部分代码,但在某些地方失败了。请帮帮我。我无法在此处粘贴代码。
  • @PrimoChalice:你能分享样本中没有用的部分吗?尽管我怀疑其他原因是无法使其工作的原因。您可以在我的演示网址中添加示例
【解决方案3】:

在要保留的部分周围使用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

详情

  • (&lt;\w+[^&lt;&gt;/]*&gt;)\s+ - 第 1 组 ($1):&lt;,1+ 个单词字符,除 &lt;&gt;/ 以外的 0 个或多个字符(请注意,您不必在 / 中转义一个 .NET 正则表达式),然后是 &gt;,然后是组外的 1+ 个空格
  • | - 或
  • \s+ - 1+ 个空格
  • (&lt;/\w+&gt;) - 第 2 组 ($2):&lt;/,1+ 个单词字符和一个 &gt;

这里是.NET regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2020-06-05
    • 2010-11-14
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多