将字符串拆分为三个独立的部分
Split a string into three seperate parts
我有一个 URL 字符串进入 API 例如c1:1=25
.
*http://mysite/api/controllername?serial=123&c1:=25*
我想拆分成频道名称(c1),冒号后的频道读数(1)和值(25)。
也有没有冒号的情况,因为它是一个固定值,例如序列号(serial=123)。
我创建了一个 class:
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
您可以使用正则表达式。我认为您在示例中切换了频道号和冒号,所以我的代码反映了这一假设。
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");
它会 return(并打印)
[123] [1] [25]
[123] [] [25]
[123] [] []
我有一个 URL 字符串进入 API 例如c1:1=25
.
*http://mysite/api/controllername?serial=123&c1:=25*
我想拆分成频道名称(c1),冒号后的频道读数(1)和值(25)。
也有没有冒号的情况,因为它是一个固定值,例如序列号(serial=123)。
我创建了一个 class:
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
您可以使用正则表达式。我认为您在示例中切换了频道号和冒号,所以我的代码反映了这一假设。
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");
它会 return(并打印)
[123] [1] [25]
[123] [] [25]
[123] [] []