Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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#_Regex_String - Fatal编程技术网

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(")", "");