C# 如何从较长的字符串中解析出此字符串?
我有一根绳子进来了C# 如何从较长的字符串中解析出此字符串?,c#,regex,string,C#,Regex,String,我有一根绳子进来了 FirstName LastLast (WorkerId) 例如: "Joe Thompson (234DerX)" 我想把它解析成这个person对象 class Person { public string Name; //Joe Thompson public string WorkerId; //234DerX } 解析工作者Id和姓名的最佳方法是什么。正则表达式?简单点的。有些名字有中间名或多个名字,因此我唯一可以依赖的是工
FirstName LastLast (WorkerId)
例如:
"Joe Thompson (234DerX)"
我想把它解析成这个person对象
class Person
{
public string Name; //Joe Thompson
public string WorkerId; //234DerX
}
解析工作者Id和姓名的最佳方法是什么。正则表达式?简单点的。有些名字有中间名或多个名字,因此我唯一可以依赖的是工作id被“(“+”)包围。您可以这样做:
var splitted = "Joe Thompson (234DerX)".Split(" ".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries);
var id = splitted.Last();
var name = string.Join(" ", splitted.Take(splitted.Count() - 1));
它将把最后一部分解析为Id,将所有前面的部分解析为Name。您可以从
(
和)
中修剪id如果您使用正则表达式,下面的正则表达式应该满足您的需要:
@" *(?<name>.*) \((?<id>.*)\)"
@“*(?.*)\(?.*)”
Name
存储在捕获组Name
中,WorkerId
存储在捕获组id
中
这假定工作者ID位于最后一对括号中
即使由于某种原因(例如,John(第三个)(JK4532R)
)名称包含括号,该解决方案也应该有效。但是,如果输入中缺少工作ID,并且名称的末尾有括号(例如,John(第三个)
)如果我理解正确,则无法区分名称和工作ID,您只需按间隔拆分字符串,然后取最后生成的字符串,从前面和后面的支架修剪它,你就有了id。
至于名字,因为你不知道到底有多少个名字,如果你只想把其中的一些名字放在字符串中会更难。如果只需要名字中的第一个和姓氏中的最后一个,那么只需获取拆分后的数组中的第一个和倒数第二个字符串
大概是这样的:
var splitArray = "Joe Thompson (234DerX)".Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
var id = splitArray.Last().Trim(new char['(',')']);
var name = splitArray[0] + " " + splitArray[splitArray.Length - 2];
var person = new Person();
person.Id = id;
person.Name = name;
正如您在您的帖子中提到的,我唯一可以信赖的是工作人员id被“(“+”)包围我将建议以下解决方案:
class Person
{
public Person(string str)
{
int pos = str.LastIndexOf('(');
Name = str.Substring(0, pos - 1);
WorkerId = str.Substring(pos + 1).TrimEnd(')');
}
public string Name;
public string WorkerId;
}
如果这么简单的话,我认为正则表达式是一种过度使用
int idStart = personStr.IndexOf('(');
int idEnd = personStr.IndexOf(')');
Name = personStr.SubString(0, idStart);
WorkerId = personStr.SubString(idStart + 1, idEnd - idStart);
当然,您必须验证peronStr的格式是否正确 您可以使用如下拆分方法:-
var split = yourString.Split(new char[] {"("});
请阅读MSDN文件。有关拆分内存分配影响的详细信息 这实际上取决于原始源文本中数据的结构(如果是结构化的话)。但是可能是regex的工作,是的。我认为不知道所有的变化是不可能的。如果你唯一能依赖的是工人id的格式,那就不可能了。编辑:我读错了,抱歉。我以为你想区分第一个名字和第二个名字。这真的很容易,因为您只需要获取工作者id,其余的是Name
。这会解析出任何地方的“(”或“)”吗?@leora我不明白这个问题。但是如果你问,如果我检查(< /代码> -答案是否定的。我想USERID是最后一个条目。这正是我在写作中的答案。+ 1。不过,你需要去掉WOKERID的括号来满足OP的要求。好的,我加了它。真的有必要投票否决吗?嗯……是的。你的答案是不好的,这就是投票的工作方式。不,对不起,我明白你的意思了。
string hld = "Joe Thompson (234DerX)";
char[] separator = new char[] { '(' };
string[] strSplitArr;
strSplitArr = hld.Split(separator);
string Name = strSplitArr[0].ToString();
string WorkerId = strSplitArr[1].ToString().Replace(")", "");