字符串格式总是像这样"FirstName = ABC; LastName = XZY; Username = User1; Password = 1234".
我需要唯一的UserName值(在这种情况下是'User1').我希望使用substring方法(或其他方法)在最小代码行中实现此目的.
救命?
Mic*_*tum 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
Run Code Online (Sandbox Code Playgroud)
Ode*_*ded 12
看起来像一个分隔的字符串,所以这将工作:
string result = myString.Split(';')[2].Split('=')[1];
Run Code Online (Sandbox Code Playgroud)
但是,如果有人更改了值对顺序,则会中断.
有更好的方法,如果订单改变,参数的数量不同等也不会破坏 - 例如迈克尔发布的正则表达式,或许多人发布的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]);
Run Code Online (Sandbox Code Playgroud)
即使值对以不同的顺序给出,此方法也将起作用。它以分号为分隔符,查找包含“用户名”的项目,然后返回等号后面的内容。
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];
Run Code Online (Sandbox Code Playgroud)