【问题标题】:Regular expression to help in splitting a string帮助拆分字符串的正则表达式
【发布时间】:2014-08-21 18:16:56
【问题描述】:

我有一个格式如下的字符串:

文件 = " \r\n 6 : size=70 : <Message body> \r\n 4 : size=3 : Test.txt \r\n 17 : size=24 : Test2.txt"

我想写一个正则表达式来去掉所有的空格,然后将字符串拆分成一个字符串数组,如下所示:

stringArray[0] = "6:size=70:<Message body>"

stringArray[1] = "4:size=3:Test.txt"

stringArray[2] = "17:size=24:Test2.txt"

我正在尝试这样做:

Regex pattern = new Regex(@"\s", RegexOptions.Compiled);
files = pattern.Replace(files, String.Empty);
string[] scores = files.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

但问题是我的正则表达式连“\r\n”都去掉了,所以我不可能通过Environment.NewLine将它拆分,那么我该如何实现这种行为呢?

编辑:我忽略了一件事。我想在拆分<Message body> 或任何其他拆分字符串时保留空格,所以我实际上需要在最后一个冒号的第一个字符之后但在 \r\n 的最后一个字符之前保留空格...例如,@987654328 @ 或 Test 3.txt 应该保留空格。

编辑:我想先用正则表达式,再拆分,

【问题讨论】:

  • 您可以先拆分,然后删除空格。但是“消息正文”中有空格,所以你真的要删除空格吗?
  • 这是您要找的东西吗? DEMO
  • @KyleW 不,我想我忽略了这个事实,我想在消息正文中保留空格。
  • @KyleW 抱歉,我编辑了问题。
  • @user3218114 很抱歉,不完全是。我编辑了问题!

标签: c# .net regex string split


【解决方案1】:

在正则表达式中,'\s' 匹配包括换行在内的空白字符,以避免删除新行,将 \s 替换为单个空格 "" 这应该会给您所需的行为

Regex pattern = new Regex(@" ", RegexOptions.Compiled);

【讨论】:

    【解决方案2】:

    这是一种没有正则表达式的方法。

    string x = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test2.txt";
    
    string[] scores = x.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                .Select(p => p.Trim())
                .Where(p => p!=string.Empty).ToArray();
    

    【讨论】:

      【解决方案3】:

      根据您所说的输入/输出,在我看来您真正想要做的是拆分每个 \r\n,然后有选择地替换空格。

      如果您需要进行 regex->split,那么这里有一个可行的解决方案(考虑到非常有限的输入)。

          static void Main(string[] args)
          {
              var s = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test2.txt";
              var pattern = "\n.*";
      
              var match = Regex.Match(s, pattern);
      
              while (match.Success)
              {
                  Console.WriteLine(match.Value.Trim().Replace(" : ", ":"));
                  match = match.NextMatch();
              }
      
              Console.ReadKey();
          }
      

      或者,这是一个单行解决方案,虽然可读性要差得多,IMO:

          static void Main(string[] args)
          {
              var s = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test2.txt";
              var pattern = "\n.*";
      
              Regex.Matches(s, pattern).Cast<Match>().Select(match => match.Value.Trim().Replace(" : ", ":")).ToList().ForEach(Console.WriteLine);
      
              Console.ReadKey();
          }
      

      【讨论】:

      • -1 不需要while循环,这可以使用拆分函数来完成
      • 同时满足这个约束? “编辑:我想先使用正则表达式,然后再拆分。”此外,您的解决方案剥离了“”之间的空间。
      【解决方案4】:
      var s = " \r\n     6 : size=70 : <Message body> \r\n    4 : size=3 : Test.txt \r\n    17 : size=24 : Test 2.txt";
      
      var split = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
      
      var results = split.Select(x => 
      {
          var lastColonIndex = x.LastIndexOf(":");
          int nonWhiteSpaceIndex = lastColonIndex + 1;
          for(; nonWhiteSpaceIndex < x.Length; ++nonWhiteSpaceIndex)
          {
              if(!char.IsWhiteSpace(x[nonWhiteSpaceIndex]))
              {
                  nonWhiteSpaceIndex.Dump();
                  break;
              }
          }
          return (x.Substring(0, nonWhiteSpaceIndex).Replace(" ", "") + x.Substring(nonWhiteSpaceIndex)).Trim();
      }).Where(x => !string.IsNullOrWhiteSpace(x)).Dump();
      

      【讨论】:

      • 很长的路要走,基本上可以在 1 行中完成
      • 是的,我不确定你在说什么,也许你没有自己运行代码来测试它我只是运行它,我得到的结果与 OP 按照他所做的相同期待
      • @DJKRAZE 是的,我运行它。不保留那个空间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多