C#从字符串中提取名称

时间:2008-12-10 15:31:23

标签: c# regex string

我想从下面的字符串中提取'James \,Brown',但我并不总是知道这个名字是什么。逗号给我带来了一些困难,所以你建议提取James \,Brown?

OU = James \,Brown,OU =测试,DC =内部,DC =净

由于

9 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

您可以使用正则表达式:

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

答案 2 :(得分:2)

一种非常脆弱的方法可能是......

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

我不一定会提倡这种方法,但我只是从一个部门的圣诞节休息回来,我的大脑尚未充分参与。

答案 3 :(得分:1)

看起来很像是根据RFC 2253 / 4514格式化的LDAP或Active Directory专有名称。

除非你使用众所周知的名字和/或使用脆弱的黑客攻击(如正则表达式解决方案),否则你应该首先阅读规范。

如果您和我一样,一般不喜欢根据RFC实施代码 - 那么希望this guy在遵循规范方面做得比您做得更好。至少他声称符合2253。

答案 4 :(得分:1)

我开始使用正则表达式来拆分群组:

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

答案 5 :(得分:0)

用您自己喜欢的魔术字符串(可能是&amp;#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;", ","));

答案 6 :(得分:0)

如果格式始终相同:

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

原谅语法是不是正确 - 来自内存。显然,这不是非常强大,如果格式发生变化,则会失败。

干杯。

答案 7 :(得分:0)

如果斜杠始终存在,我会查看可能使用RegEx进行匹配,您可以使用匹配组作为姓氏和名字。

^ OU =([A-ZA-Z] )\,\ S([A-ZA-Z]

RegEx将匹配仅包含字符的名称,您需要对其进行一些优化,以便更好地匹配非标准名称。 Here is a RegEx tester如果您走这条路,可以帮助您。

答案 8 :(得分:0)

假设您在Windows中运行,请将PInvoke与DsUnquoteRdnValueW一起使用。有关代码,请参阅我对其他问题的回答:https://stackoverflow.com/a/11091804/628981

豫ICP备18024241号-1