字符串格式总是这样“FirstName = ABC; LastName = XZY; Username = User1; Password = 1234”。
我需要唯一的UserName值(在这种情况下为'User1')。我想使用substring方法(或其他东西)在最小代码行中实现这一点。
帮助?
答案 0 :(得分:15)
为了完整起见,这是正则表达式的方法。如果订单发生变化,这也会有效。
// 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
答案 1 :(得分:12)
看起来像一个分隔的字符串,所以这可以工作:
string result = myString.Split(';')[2].Split('=')[1];
但是,如果有人更改了值对顺序,则会中断。
有更好的方法可以解决,如果订单发生变化,参数数量不同等等 - 例如迈克尔发布的正则表达式,或许多人发布的Linq查询。
答案 2 :(得分:7)
这是一个替代解决方案(与其他解决方案没有太大区别,但我认为更直接),无论顺序如何,它都能正常工作。
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]);
答案 3 :(得分:4)
最少的代码行并不总是最佳指标,但您可以使用正则表达式完成所需的操作。
答案 4 :(得分:4)
即使以不同的顺序给出值对,此方法也会起作用。它在分号上分割,找到带有“用户名”的项目,然后返回等号后面的内容。
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];
答案 5 :(得分:3)
虽然如果没有任何改变,拆分答案是'ok',但使用函数可能更好,因为:
(即使您只是将一行拆分为函数!或者至少在拆分中添加注释。)
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;
}
答案 6 :(得分:3)
不像使用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;
有人可能会说最后一篇文章有更好的语义。
编辑:更新最后一篇文章以处理没有所需元组的输入字符串。
答案 7 :(得分:1)
string t = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string name = t.Split(';')[2].Split('=')[1];
答案 8 :(得分: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;