字符串格式通常是这样的:“FirstName=ABC;LastName=XZY;Username=User1;Password=1234”。
我需要获取唯一的UserName值(在本例中为“User1”)。我希望使用substring方法(或其他方法)以最少的代码行数实现此目标。
能帮忙吗?
字符串格式通常是这样的:“FirstName=ABC;LastName=XZY;Username=User1;Password=1234”。
我需要获取唯一的UserName值(在本例中为“User1”)。我希望使用substring方法(或其他方法)以最少的代码行数实现此目标。
能帮忙吗?
为了完整起见,这里是使用正则表达式的方法。即使顺序改变,这种方法也适用。
// using System.Text.RegularExpressions;
string test1 = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string test2 = "FirstName=ABC;LastName=XZY;Password=1234;Username=User1";
string test3 = "FirstName=ABC;LastName=XZY;Password=1234";
string regexPattern = @"(?<=Username=)[^;\n]*";
var userName1 = Regex.Match(test1, regexPattern).Value; // User1
var userName2 = Regex.Match(test2, regexPattern).Value; // User1
var userName3 = Regex.Match(test3, regexPattern).Value; // string.Empty
// Compiling can speed up the Regex, at the expense of longer initial Initialization
// Use when this is called often, but measure.
Regex compiledRx = new Regex(regexPattern,RegexOptions.Compiled);
var userNameCompiled1 = compiledRx.Match(test1).Value; // User1
var userNameCompiled2 = compiledRx.Match(test2).Value; // User1
var userNameCompiled3 = compiledRx.Match(test3).Value; // string.Empty
看起来是一个分隔字符串,因此可以这样做:
string result = myString.Split(';')[2].Split('=')[1];
然而,如果有人更改了键值对的顺序,这将导致故障。
有更好的方法可以解决这个问题,即使顺序改变、参数数量不同等情况也不会出现故障 - 比如Michael发布的正则表达式,或其他用户发布的Linq查询。
这里有一个替代方案(与其他方案不太不同,但我认为更直接),它可以在任何顺序下工作。
var input = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
Assert.AreEqual("User1", input
.Split(';')
.Select(item => item.Split('='))
.Where(pair => pair[0].Equals("Username"))
.Single()[1]);
.Single()
之前添加 .Select(pair => pair[1])
并将 .Single()
更改为 .SingleOrDefault()
。然后,如果没有用户名,您只会得到 null。 - Instance Hunter代码行数最少并不总是最好的衡量标准,但是您可以使用正则表达式完成所需的任务。
即使键值对的顺序不同,此方法仍将起作用。它通过分号进行拆分,找到带有“用户名”项的内容,然后返回等号后面的内容。
string theString = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string username = theString.Split(";").Where(s => s.Split("=")[0].Equals("Username")).ToArray()[0].Split("=")[1];
虽然使用分割方法可能是“可以的”,但如果有任何变化,最好使用函数,因为:
(即使您只在函数中放置了一行分割代码!或者至少在分割代码上添加注释。)
static String GetUsername(String value)
{
String result = "";
String token = "Username=";
int index = value.IndexOf(token) + token.Length;
while (value[index] != ';')
{
result += value[index++];
if (index > value.Length - 1)
break;
}
return result;
}
不过并不像使用split方法一样简单:
string input = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string username = Regex.Match(input, "Username=(?<username>.*?)(;|$)").Groups["username"].Value;
var answers = from tuple in input.Split(';')
where tuple.StartsWith("Username=")
select tuple.Split('=')[1];
username = answers.Count() > 0 ? answers.First() : string.Empty;
可以说,最后一段代码的语义更好。
编辑:更新最后一段代码以处理没有所需元组的输入字符串。
FirstName=ABC;Username=User1;LastName=XZY;Password=1234
,则会失败。使用?
进行懒惰搜索:Username=(?<username>.*?);
- Naeem Sarfraz string t = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string name = t.Split(';')[2].Split('=')[1];
这不是最短的...但可能是最快的之一。
string value = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
int offset = value.IndexOf("Username=") + 9;
if (offset < 9)
throw new Exception("Username= not found in string");
int len = value.IndexOf(';', offset) - offset;
if (len < 0)
len = value.Length - offset;
string find = value.Substring(offset, len);
...if (len < 0)
是为了处理当用户名位于字符串末尾且不以分号结尾的情况。如果您想忽略大小写,可以将 int offset
行替换为以下内容...
int offset = value.ToUpperInvariant().IndexOf("USERNAME=") + 9;