Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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

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

C# 字符串解析:你能帮我找到一种方法来检索这个值吗?

C# 字符串解析:你能帮我找到一种方法来检索这个值吗?,c#,string,parsing,C#,String,Parsing,我需要以某种方式检测是否存在父OU值,以及是否存在并检索它 例如,此处没有父项: LDAP://servera/OU=Santa Cruz,DC=contoso,DC=com 但在这里,有一位家长: LDAP://servera/OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com 所以我需要检索Ventas字符串 另一个例子: LDAP://servera/OU=Contabilidad,OU=Ventas,OU=Santa Cruz,DC=contoso,D

我需要以某种方式检测是否存在父OU值,以及是否存在并检索它

例如,此处没有父项:

LDAP://servera/OU=Santa Cruz,DC=contoso,DC=com
但在这里,有一位家长:

LDAP://servera/OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com
所以我需要检索Ventas字符串

另一个例子:

LDAP://servera/OU=Contabilidad,OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com
我还需要检索Ventas字符串


关于如何解决这个问题有什么建议吗?

我会发现第一次出现OU=。。。并得到它的价值。然后我会检查是否有另一个事件发生。如果是,返回我得到的值。如果没有,则在没有父字符串的情况下返回所需的内容。空、空、空或其他任何内容

您也可以使用以下常规express:

var regex = new Regex(@"OU=(.*?),");
var matches = regex.Matches(ldapString);
然后检查有多少个匹配项。如果>1,则返回从第一个匹配中捕获的值

更新

上面的正则表达式需要改进,以允许LDAP字符串中存在转义逗号\。可能是这样的:

var regex = new Regex(@"OU=((.*?(\\\,)+?)+?),");
这可能会被打破,也许有更简单的方法来做同样的事情。我不是正则表达式向导

另一个更新


根据Kimberly在下面的评论,正则表达式应该是@OU=?:。*?:\ \ \,*?+?,。

我会发现OU=。。。并得到它的价值。然后我会检查是否有另一个事件发生。如果是,返回我得到的值。如果没有,则在没有父字符串的情况下返回所需的内容。空、空、空或其他任何内容

您也可以使用以下常规express:

var regex = new Regex(@"OU=(.*?),");
var matches = regex.Matches(ldapString);
然后检查有多少个匹配项。如果>1,则返回从第一个匹配中捕获的值

更新

上面的正则表达式需要改进,以允许LDAP字符串中存在转义逗号\。可能是这样的:

var regex = new Regex(@"OU=((.*?(\\\,)+?)+?),");
这可能会被打破,也许有更简单的方法来做同样的事情。我不是正则表达式向导

另一个更新


根据Kimberly在下面的评论,正则表达式应该是@OU=?:.*?:\ \ \,*?+?,。

叫我疯了,但我会这样做的嘿,妈,看,一行代码!:

var str = "LDAP://servera/OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com";
var result = str.Substring(str.LastIndexOf('/') + 1).Split(',')
                .Select(s => s.Split('='))
                .Where(a => a[0] == "OU")
                .Select(a => a[1])
                .Reverse().Skip(1).FirstOrDefault();
结果为null或具有所需的字符串。无论有多少个OU在其中,只要字符串的格式一开始就有效,这都将起作用,并将第二个OU返回到最后一个OU

更新:可能的改进:

如果DN包含转义正斜杠或转义逗号,则上述操作将无法正常工作

要解决这两个问题,需要使用正则表达式。更改:

str.Substring(str.LastIndexOf('/') + 1).Split(',')
致:

这样做的目的是通过在正斜杠上拆分后获取str的最后一部分来分隔DN,并通过在逗号上拆分来拆分DN中的部分。在这两种情况下,都使用负查找来确保斜杠/逗号没有转义


我知道没那么漂亮。但还是一行耶!而且它仍然允许您使用LINQ以任何方式处理多个OU。

称我为疯子,但我会这样做嘿,妈,看,一行代码!:

var str = "LDAP://servera/OU=Ventas,OU=Santa Cruz,DC=contoso,DC=com";
var result = str.Substring(str.LastIndexOf('/') + 1).Split(',')
                .Select(s => s.Split('='))
                .Where(a => a[0] == "OU")
                .Select(a => a[1])
                .Reverse().Skip(1).FirstOrDefault();
结果为null或具有所需的字符串。无论有多少个OU在其中,只要字符串的格式一开始就有效,这都将起作用,并将第二个OU返回到最后一个OU

更新:可能的改进:

如果DN包含转义正斜杠或转义逗号,则上述操作将无法正常工作

要解决这两个问题,需要使用正则表达式。更改:

str.Substring(str.LastIndexOf('/') + 1).Split(',')
致:

这样做的目的是通过在正斜杠上拆分后获取str的最后一部分来分隔DN,并通过在逗号上拆分来拆分DN中的部分。在这两种情况下,都使用负查找来确保斜杠/逗号没有转义


我知道没那么漂亮。但还是一行耶!而且它仍然允许您使用LINQ以任何方式处理多个OU。

\n如果“Santa Cruz”是父OU,“Ventas”是子OU,则w+将不匹配。编辑,呃,就这一点来说,我的不会和华盛顿特区的匹配。回到绘图板。您可以使用\s+而不是编辑的示例中的\w+或[^,]。\n如果“Santa Cruz”是父OU,“Ventas”是子OU,则w+将不匹配。编辑,呃,就这一点来说,我的不会和华盛顿特区的匹配。回到绘图板。您可以使用\s+而不是编辑过的示例中的\w+或[^,]来进行编辑。我假设答案需要适用于任何可能出现的LDAP URL?因此,OU可能不是列表中的第一个属性,它的值可能包含“\”、“,等等。?我认为到目前为止,我的答案对您的示例有效,但可能不适用于您需要的所有内容。我假设答案需要适用于任何人可能想到的LDAP URL?因此,OU可能不是列表中的第一个属性,它的值可能包含“\”、“,等等。?我认为到目前为止,我的答案包括对你的例子有用,但可能不适用于你需要的所有东西。越来越暖和!我想应该是这样:@OU=?:?,。这将为每个匹配返回一个组,允许您最初描述的逻辑
PPY,前提是您将其调整为“从第二个到最后一个匹配返回.Groups[1]”。我在这里测试了一下:另外,我很抱歉对我之前的评论造成混淆。我以为我删除它的速度够快的,但后来有一些停机时间,所以谁知道发生了什么。@Kimberly:谢谢。我已将您的更新添加到我的答案中。如果我的答案被接受,我会给你一半的分数-越来越暖和了!我想应该是这样:@OU=?:?,。这将为每个匹配返回一个组,允许应用您最初描述的逻辑,前提是您将其调整为“从第二个匹配返回.Groups[1]”。我在这里测试了一下:另外,我很抱歉对我之前的评论造成混淆。我以为我删除它的速度够快的,但后来有一些停机时间,所以谁知道发生了什么。@Kimberly:谢谢。我已将您的更新添加到我的答案中。如果我的答案被接受,我会给你一半的分数-@AndrewCooper:更新为支持正则表达式的版本,该版本可以正常工作。顺便说一句,在这里使用正则表达式的方式是消极回顾,这使它更容易理解。另一方面,反斜杠hell:/您可以使用以下逐字字符串文本来减少反斜杠hell:Regex.Splitstr,@?@AndrewCooper:使用启用Regex的版本进行更新,该版本可以正常工作。顺便说一句,在这里使用正则表达式的方式是消极回顾,这使它更容易理解。另一方面,反斜杠地狱:/n您可以使用如下逐字字符串文字来减少反斜杠地狱:Regex.Splitstr,@?