English 中文(简体)
C# 从字符串中提取名称
原标题:
  • 时间:2008-12-10 15:31:22
  •  标签:

我想从下面的字符串中提取James, Brown,但我并不总是知道名字是什么。逗号使我有些困难,你有什么建议可以提取James, Brown?

OU = 詹姆斯,布朗,OU = 测试,DC = Internal,DC = 网络

谢谢 (Xièxiè)

问题回答

正则表达式可能是您最好的方法

static string ParseName(string arg) {
    var regex = new Regex(@"^OU=([a-zA-Z\]+,s+[a-zA-Z\]+),.*$");
    var match = regex.Match(arg);
    return match.Groups[1].Value;
}

您可以使用正则表达式:

string input = @"OU=James, Brown,OU=Test,DC=Internal,DC=Net";
Match m = Regex.Match(input, "^OU=(.*?),OU=.*$");
Console.WriteLine(m.Groups[1].Value);   

一种相当脆弱的方法可能是...

string name = @"OU=James, Brown,OU=Test,DC=Internal,DC=Net";
string[] splitUp = name.Split("=".ToCharArray(),3);
string namePart = splitUp[1].Replace(",OU","");
Console.WriteLine(namePart);

我不一定支持这种方法,但我刚刚从部门的圣诞午餐回来,我的大脑还没有完全参与进来。

我会从一个正则表达式开始来分离这些组:

    Regex rx = new Regex(@"(?<!\),");
    String test = "OU=James\, Brown,OU=Test,DC=Internal,DC=Net";
    String[] segments = rx.Split(test);

但是从那里开始,我会手动分割数组中的参数,这样您就不必使用依赖于超过分隔符字符的正则表达式。由于这看起来像是一个LDAP查询,如果您始终查看params [ 0 ],可能并不重要,但是有可能名称设置为"CN ="。您可以通过以下方式仅阅读查询来处理这两种情况:

    String name = segments[0].Split( = , 2)[1];

那看起来非常像根据RFC 2253/RFC 4514格式化的LDAP或Active Directory区别名称。

除非您正在使用知名名称和/或可以接受易碎的hackaround(如正则表达式解决方案)-否则您应该从阅读规范开始。

如果你和我一樣,通常討厭根據RFC實現代碼 - 那麼希望這個人按照規格比你做得更好。他至少聲稱符合2253標準。

如果斜杠始终存在,我会考虑使用正则表达式进行匹配,您可以为姓和名使用一个匹配组。

^OU=([a-zA-Z]),s([a-zA-Z])

那个正则表达式将匹配只包含字符的名称,你需要对其进行一些精细化处理以更好地匹配非标准名称。如果您选择这条路,这里有一个正则表达式测试器可以帮助您。

用你喜欢的魔术字符串替换 "," (例如 & #44;),在剩余的逗号上进行分割或搜索直到第一个逗号,然后用单个逗号替换魔术字符串。

例如:

string originalStr = @"OU=James, Brown,OU=Test,DC=Internal,DC=Net";
string replacedStr = originalStr.Replace(",", "&#44;");

string name = replacedStr.Substring(0, replacedStr.IndexOf(","));
Console.WriteLine(name.Replace("&#44;", ","));

假设您在Windows上运行,请使用带有DsUnquoteRdnValueW的PInvoke。有关代码,请参见我对另一个问题的答案:https://stackoverflow.com/a/11091804/628981

如果格式始终相同:

string line = GetStringFromWherever();

int start = line.IndexOf("=") + 1;//+1 to get start of name
int end = line.IndexOf("OU=",start) -1; //-1 to remove comma

string name = line.Substring(start, end - start);

如果语法不太正确请原谅-是从记忆中编写的。显然这不是非常健壮的,如果格式发生了变化就会失败。





相关问题
热门标签