Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c#从字符串中生成子字符串?_C#_.net_Substring - Fatal编程技术网

如何使用c#从字符串中生成子字符串?

如何使用c#从字符串中生成子字符串?,c#,.net,substring,C#,.net,Substring,字符串格式总是这样:“FirstName=ABC;LastName=XZY;Username=User1;Password=1234” 我需要唯一的用户名值(在本例中为“User1”)。我希望使用子字符串方法(或其他方法)在最少的代码行中实现这一点 帮助?看起来像一个带分隔符的字符串,因此可以这样做: string result = myString.Split(';')[2].Split('=')[1]; 但是,如果有人更改值对顺序,这将中断 关于这一点,有更好的方法,如果顺序改变、参数数量

字符串格式总是这样:“FirstName=ABC;LastName=XZY;Username=User1;Password=1234”

我需要唯一的用户名值(在本例中为“User1”)。我希望使用子字符串方法(或其他方法)在最少的代码行中实现这一点


帮助?

看起来像一个带分隔符的字符串,因此可以这样做:

string result = myString.Split(';')[2].Split('=')[1];
但是,如果有人更改值对顺序,这将中断


关于这一点,有更好的方法,如果顺序改变、参数数量不同等,这些方法不会中断-例如Michael发布的正则表达式,或者许多人发布的Linq查询。

最少的代码行数并不总是最佳的度量标准,但是,您可以使用正则表达式执行所需的操作。

即使值对以不同的顺序给出,这种方法也可以工作。它在分号上拆分,找到带有“Username”的项,然后返回等号后面的内容

        string t = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
        string name = t.Split(';')[2].Split('=')[1];
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];

这里有一个替代解决方案(与其他解决方案没有太大区别,但我认为更简单),它将不考虑顺序地工作

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]);

为了完整起见,下面是正则表达式的实现方法。如果订单发生变化,这也会起作用

// 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
//使用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 regexpatern=@”(?如果没有任何更改,则拆分答案为“ok”,但最好使用函数,因为:

  • 它让你的意图变得清晰
  • 它更容易记录
  • 如果不可避免的情况发生,则更容易修改
  • 不管秩序如何
(即使只在函数中添加了一行分割!或者至少在分割中添加注释。)


但是,没有使用拆分那么简单:

string input = "FirstName=ABC;LastName=XZY;Username=User1;Password=1234";
string username = Regex.Match(input, "Username=(?<username>.*?)(;|$)").Groups["username"].Value;
有人可能会说,最后一段具有更好的语义


编辑:更新最后一个片段以处理没有所需元组的输入字符串。

这不是最短的…但可能是最快的

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);


我很感激你试图使它尽可能短,但我认为我们已经赢得了我最近看到的最丑陋的代码。(无意冒犯!)@user:我建议你用真名注册-我开始通过你用户id中的数字来识别你:-)奇怪的是,这可能是我第一次看到正则表达式的建议,这是一个有效的答案。:pHaven你没听说过吗?有些人在遇到问题时会想:“我知道,我会使用正则表达式。”。“现在他们有两个问题。杰米Zawinski@Tanzelax:Regex成为新的JQuery?我喜欢这是一个答案,我应该告诉大家使用C#作为我的答案。我很抱歉,但是简单地说你可以用Regex做你需要的事情并不是一个有效的答案。提供一个代码示例。@Stan R:我同意你的观点,至少你是编程新手……示例代码很有帮助……@Aaron:很抱歉,语法正确吗。我正在接近错误。ToArray[0]…???@user144842:您在我的示例中发现了一个错误!ToArray后面应该有括号。我已经更新了我的答案,一半是VB,一半是C#。。。可能是他一时糊涂。你的建议目前最适合我。只需编辑答案陈述中的最后[0]到[1]。谢谢。我喜欢把这个“逻辑”封装起来的建议,但让我们作恶吧:他的样本没有以“;”结尾。现在想象一下“Username=”部分已经结束,您的解决方案会发生什么情况?@Benjamin-虽然不难处理这种情况;我认为所有提出的解决方案都有一些不足之处。例如,如果字符串中有两个用户名呢?会发生什么?这个解决方案总是选择第一个。无论如何,我认为这个微不足道的问题已经走到了极端。当一个问题有了像这样的明确答案时,看到SO社区提供了多少不同的解决方案,我总是觉得很有趣。需要注意的是:输入字符串有一个名为“Usernname”的字段。然后要求输入“用户名”字段。分析字符串时要小心大小写。当然,有一些方法可以解决这个问题。我知道“幻数”可以被移动“Username=”到一个变量(如token)并使用token.Length.来代替。请随意抱怨“异常”。例如,我觉得没有更好的方法。如果源字符串是
FirstName=ABC,则会失败;用户名=User1;LastName=XZY;密码=1234
。使用
进行惰性搜索:
用户名=(?*?)@Naeem Sarfraz:谢谢,你说得对。该死的贪婪的东西。此外,我还纠正了用户名是字符串中最后一对的情况。现在正则表达式非常复杂…当字符串中没有“用户名”时会失败。如果可能没有用户名,可以添加
。在
之前选择(pair=>pair[1])
。Single()
并将
.Single()
更改为
。SingleOrDefault()
。然后,如果没有用户名,就得到null。
var answers = from tuple in input.Split(';')
              where tuple.StartsWith("Username=")
              select tuple.Split('=')[1];

username = answers.Count() > 0 ? answers.First() : string.Empty;
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);
int offset = value.ToUpperInvariant().IndexOf("USERNAME=") + 9;