从字符串中提取名称的 C# 方法

3
我想从下面的字符串中提取“James\,Brown”,但我不总是知道名称是什么。逗号让我有些困难,你有什么建议可以提取James\,Brown?
OU = James \,Brown,OU = Test,DC = Internal,DC = Net
谢谢

1
很遗憾,你无法让你正在使用的API以结构化格式输出结果。解析很繁琐。 - Jay Bazuzi
9个回答

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

一个不错的方法,但我对此有一种不理性的恐惧。 :) - ZombieSheep
1
但是为了做到这一点,我必须承认我的恐惧是错误的,而作为一个约克郡人,我永远不会错。;-) - ZombieSheep
1
你假设每个名字中都有逗号,这可能是错误的(而且很可能是错误的)。 - VVS
@David,提问者没有明确说明,所以我只能根据他们在问题中提供的信息来回答。我也可以想知道名字中是否允许使用@符号,或者是三个名字还是两个名字。但再次强调,除非提问者在问题中明确说明,否则我们需要做出一些假设。 - JaredPar
@Jared:我只是指出一个可能在两年后生产代码中出现的错误;-)。尽管提供的示例看起来非常像LDAP DN,这就是为什么我更喜欢Mark Brackett的答案。 - VVS
显示剩余2条评论

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
一种相对脆弱的方法是...
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);

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

(注:该句话涉及个人观点,仅供参考)


2
嗨,我的名字是"Foo,OUBar",但你可以叫我"FooBar";-) - VVS

1

看起来非常像LDAP或Active Directory的专有名称,格式符合RFC 2253/4514

除非您正在使用众所周知的名称和/或可以接受脆弱的解决方案(例如正则表达式解决方案),否则您应该首先阅读规范。

如果您像我一样通常不喜欢按照RFC实现代码,则希望this guy按照规范执行得比您好。至少他声称符合2253标准。


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

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

如果语法不太对,请谅解 - 我是凭记忆写的。显然,这种方法不够健壮,如果格式发生变化就会失败。


实际上,SubString的第二个参数是长度而不是endIndex。在你的例子中,它应该是name = line.SubString(start, end - start)。我一直很讨厌SubString的这一点,这也是我创建允许startIndex和endIndex的扩展方法的原因。 - BFree
xan - 我已经编辑过了,纠正了语法,因为我在一台安装有Snippetcompiler的机器前面。 :) - ZombieSheep

0

如果斜杠始终存在,我会考虑使用正则表达式进行匹配,您可以使用匹配组来匹配名字的最后和第一部分。

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

这个正则表达式将匹配只包含字符的名称,您需要对其进行精细调整以更好地匹配非标准名称。 这里有一个正则表达式测试器,如果您选择使用此方法,它可以帮助您完成。


0

0

将 \ 替换为您自己喜欢的魔术字符串(例如 & #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;", ","));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接