【问题标题】:Regex for positive integers separated by abritrary space [duplicate]由 abritrary 空格分隔的正整数的正则表达式 [重复]
【发布时间】:2016-08-18 00:00:27
【问题描述】:

输入示例: " 1 4 2 5 9 "

通缉:"1""4""2""5""9"

使用喜欢

var rgx = new Regex("???"); 
var matches = rgx.Matches("  1  4 2 5 9 ");
var nums = new List<int>();
foreach(var match in matches)
    nums.Add(match.Caputre.Value);

【问题讨论】:

  • 为什么是正则表达式?字符串总是只包含数字块和空格吗?
  • @WiktorStribiżew 如果您有比在此处使用正则表达式更好的建议,请告诉我。简单地说,我需要的是从由任意数量的空格分隔的整数字符串中解析出整数。
  • 您的意思是任何空格或文字空格(如您的示例所示)?
  • 文字空间,我猜
  • Split() on " " 设置了 StringSplitOptions.RemoveEmptyEntries?

标签: c# regex


【解决方案1】:

如果您确定只有空格和数字块,您可以使用 LINQ 并使用 int.Parse 解析整数:

var str = "  1  4 2 5 9 ";
var res = str.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries)
     .Select(r => int.Parse(r))
     .ToList();

如果您还需要某种预验证(以确保您的字符串仅包含任何空格和数字块,您可以使用更安全的基于正则表达式的解决方案:

var res2 = Regex.Matches(str, @"^(?:\s*([0-9]+))+\s*$")
    .Cast<Match>()
    .SelectMany(p => p.Groups[1].Captures.Cast<Capture>().Select(m => int.Parse(m.Value)))
    .ToList(); 

两者都导致:

【讨论】:

    【解决方案2】:

    拆分将是一种较慢的方法。

    尝试使用matches(),类似:

    var nums = new List<int>();
    foreach (Match match in Regex.Matches("  1  4 2 5 9 ", @"\d+"))
    {
        nums.Add(Int32.Parse(match.Value));
    }
    
    ///////////////
    StringBuilder builder = new StringBuilder();
    foreach (int nN in nums)
    {
        builder.Append(nN).Append(",");
    }
    string result = builder.ToString();
    Console.WriteLine("{0}", result);
    

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多