【问题标题】:Split a string into three seperate parts将字符串拆分为三个单独的部分
【发布时间】:2018-08-30 05:43:58
【问题描述】:

我有一个 URL 字符串进入 API,例如c1:1=25.

*http://mysite/api/controllername?serial=123&c1:=25*

我想将其拆分为通道名称(c1)、冒号后的通道读数编号(1)和值(25)。

也有没有冒号的情况,因为它是一个固定值,例如序列号 (serial=123)。

我已经创建了一个类:

public class UriDataModel
{
     public string ChannelName { get; set; }
     public string ChannelNumber { get; set; }
     public string ChannelValue { get; set; }
}

我正在尝试将 IEnumerable 与一些 LINQ 一起使用,但并没有走得太远。

var querystring = HttpContext.Current.Request.Url.Query;
querystring = querystring.Substring(1);           

var urldata = new UrlDataList
{
    UrlData = querystring.Split('&').ToList()
};

IEnumerable<UriDataModel> uriData =
        from x in urldata.UrlData
        let channelname = x.Split(':')
        from y in urldata.UrlData
        let channelreading = y.Split(':', '=')
        from z in urldata.UrlData
        let channelvalue = z.Split('=')
        select new UriDataModel()
        {
             ChannelName = channelname[0],
             ChannelNumber = channelreading[1],
             ChannelValue = channelvalue[2]
        };

        List<UriDataModel> udm = uriData.ToList();

我觉得我在这里把事情复杂化了。

综上,我想把字符串分成三部分,没有冒号的地方一分为二。

任何指针都会很棒。 TIA

【问题讨论】:

  • 参数的顺序给定了吗? (可以是...?c1:=25&amp;serial=123,还是不是?) 如果不是,为什么不使用Regex
  • 它们通常按固定顺序排列,但是一旦我将它们放在列表中,我需要按另一个字段对它们进行排序。不过我会检查正则表达式,我没想到...
  • 您可以使用regex101.com 测试您的Regex,然后使用Regex 类将其应用到C#。

标签: c# asp.net-web-api query-string asp.net-apicontroller


【解决方案1】:

您可以使用正则表达式。我认为您在示例中切换了频道号和冒号,所以我的代码反映了这个假设。

public static (string channelName, string channelNumber, string channelValue) ParseUrlData(string urlData)
{
    var regex = new Regex(@"serial=(\d+)(&c(:\d+)?=(\d+))?");
    var matches = regex.Match(urlData);
    string name = null;
    string number = null;
    string value = null;
    if (matches.Success)
    {
        name = matches.Groups[1].Value;
        if (matches.Groups.Count == 5) number = matches.Groups[3].Value.TrimStart(':');
        if (matches.Groups.Count >= 4) value = matches.Groups[matches.Groups.Count - 1].Value;
    }

    Console.WriteLine($"[{name}] [{number}] [{value}]");
    return (name, number, value);
}

那你就可以这样称呼了

(var channelName, var channelNumber, var channelValue) = ParseUrlData("serial=123&c:1=25");
(var channelName, var channelNumber, var channelValue) = ParseUrlData("serial=123&c=25");
(var channelName, var channelNumber, var channelValue) = ParseUrlData("serial=123");

它会返回(并打印)

[123] [1] [25]
[123] [] [25]
[123] [] []

【讨论】:

  • 我已经完成了以下操作,它正在工作。我很想知道这是否是一个正确的方法。 dotnetfiddle.net/T6jAi4
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多