Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,我想从下面的字符串中提取“James\,Brown”,但我并不总是知道名称。逗号给我带来了一些困难,那么您建议如何提取James\,Brown OU=詹姆斯\,布朗,OU=测试,DC=内部,DC=净 如果格式始终相同,谢谢: string line = GetStringFromWherever(); int start = line.IndexOf("=") + 1;//+1 to get start of name int end = line.IndexOf("OU=",start) -

我想从下面的字符串中提取“James\,Brown”,但我并不总是知道名称。逗号给我带来了一些困难,那么您建议如何提取James\,Brown

OU=詹姆斯\,布朗,OU=测试,DC=内部,DC=净


如果格式始终相同,谢谢:

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

如果语法不太正确,请原谅-从内存中。显然,这不是很健壮,如果格式发生变化,就会失败。

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

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

我不一定提倡这种方法,但我刚从一个部门的圣诞聚会回来,我的大脑还没有完全投入。正则表达式可能是你最好的方法

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

如果斜杠一直存在,我会考虑使用RegEx进行匹配,您可以使用匹配组来表示姓氏和名字

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

由于正则表达式将只匹配包含字符的名称,因此需要对其进行一些改进,以便更好地匹配非标准名称。如果您走这条路线,您可以使用正则表达式来帮助您。

您可以使用正则表达式:

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

我会从一个正则表达式开始,将各个组分开:

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

看起来很像LDAP或Active Directory可分辨名称,其格式根据/

除非您使用的是知名的名字和/或对脆弱的破解(如regex解决方案)没有意见,否则您应该从阅读规范开始


如果您和我一样,通常不喜欢根据RFC实现代码,那么hope在遵循规范方面比您做得更好。至少他声称自己是2253兼容的。

用你自己喜欢的魔法字符串(也许是,;)替换\,在剩余的逗号上拆分,或者搜索到第一个逗号,然后用一个逗号替换你的魔法字符串

i、 e.类似于:

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中运行,请将PInvoke与一起使用。有关代码,请参见我对另一个问题的回答:

实际上,SubString的第二个参数是length,而不是endIndex。在您的示例中,它应该是name=line.SubString(start,end-start)。我一直讨厌Substring,这就是为什么我创建了允许startIndex和endIndex.xan的扩展方法-我编辑以更正语法,因为我在安装了Snippetcompiler的机器前面。:)这是一个很好的方法,但其中一个我有一种非理性的恐惧但为了做到这一点,我必须承认我的恐惧是错误的,作为一个约克郡人,我从来没有错过你假设每个名字都有一个逗号,这可能是错误的(也可能是错误的)。@David,提问者没有这样或那样提到它,所以我只能继续回答他们在问题中的内容。我还想知道名称中是否允许使用@。或者3个名字对2个。但是再一次,除非询问者提出问题,否则假设是必要的。@Jared:我只是指出一个潜在的错误,可能在两年后的生产代码中出现;-)。尽管如此,提供的示例看起来还是很像LDAP DN,这就是为什么我更喜欢Mark Brackett的答案。解析很烦人。嗨,我的名字是“Foo,OUBar”,但你可以叫我“FooBar”;-)
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;", ","));