1

DistinguishedNameDirectoryServices.AccountManagementを使用すると、次のようなユーザーが表示されます。

CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu

これから最初のOU値を取得する必要があります。
私は同様の解決策を見つけました:C#文字列から名前を抽出する

そして、いくつかの調整を使用して、このコードを作成しました。

string input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu";
Match m = Regex.Match(input, @"OU=([a-zA-Z\\]+)\,.*$");
Console.WriteLine(m.Groups[1].Value);

このコードはSTORE期待どおりに返されますが、に変更Groups[1]するGroups[0]と、入力文字列とほぼ同じ結果が得られます。

OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu

この正規表現を変更して、の値のみを返すようにするにはどうすればよいOUですか?したがって、この例では、2つの一致の配列を取得します。文字列にOUが多いと、配列は長くなります。

編集: コードを(@dasblinkenlightの提案を使用して)関数に変換しました:

private static List<string> GetOUs()
{
    var input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu";
    var mm = Regex.Matches(input, @"OU=([a-zA-Z\\]+)");
    return (from Match m in mm select m.Groups[1].Value).ToList();
}

あれは正しいですか?

4

4 に答える 4

1

正規表現は(ほぼ)問題ありません。間違ったAPIを使用しているだけです。

終了アンカーまで一致する正規表現の部分を削除し、の呼び出しをの$呼び出しに変更して、次のようにループで一致を取得します。MatchMatches

var input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu";
var mm = Regex.Matches(input, @"OU=([a-zA-Z\\]+)");
foreach (Match m in mm)
    Console.WriteLine(m.Groups[1].Value);
}
于 2013-02-20T14:37:15.953 に答える
1

既存の正規表現:

@"OU=([a-zA-Z\\]+)\,.*$"

に一致OU=し、次にいくつかの文字と円記号([a-zA-Z\\]+)、次にコンマ、次に任意の文字(.*)を行末($)に一致させます。

したがって、単一の一致は常に最初のOUセクションの後の行全体に一致します。

,.*$各OUグループに一致する最後のを削除して、正規表現を変更します。

@"OU=([a-zA-Z\\]+)"

また、括弧はキャプチャグループであることに注意してください。これらは、値の部分だけを単独でキャプチャする場合にも役立ちますが、それを使用しない場合は不要であり、次のようにすることができます。

@"OU=[a-zA-Z\\]+"
于 2013-02-20T14:30:51.937 に答える
0

試合とグループを混同しているからです

string input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu";
MatchCollection mc = Regex.Matches(input, @"OU=([a-zA-Z\\]+),");

foreach(Match m in mc)
{
  Console.WriteLine(m.Result("$1"));
}
于 2013-02-20T14:34:46.383 に答える
0

Group[0]完全一致 Group[1]を返します:一致の最初のパターンを返します[つまり、最初の括弧内のすべて'('')']

したがって、OUのこれら2つのオカレンスを正確に取得したい場合は、次のようにすることができます。

 Match m = Regex.Match(input, @"OU=([a-zA-Z\\]+)\,OU=([a-zA-Z\\]+)\,.*$");
 Console.WriteLine(m.Groups[1].Value);
 Console.WriteLine(m.Groups[2].Value);

Group[0]完全一致を返します:(不要な) Group[1]一致の最初のパターンを返します[つまり、最初の括弧内のすべて'('')'] Group[2]は、一致中の2番目のパターンを返します[つまり、2番目の括弧内のすべて'( '')']

寄付:STORE COMPANY

ただし、関心のあるパターンごとに正規表現を明示したくないと思います。複数の一致を取得する場合は、Matchcollectionを返すRegexのMatches呼び出しを実行する必要があります。

MatchCollection ms = Regex.Matches(...);

ただし、これは現在の正規表現では機能しません。これは、それ以降のすべてSTOREが最初の一致になるためです。「OU=」の後に「1文字以上」のパターンのみを取得したい場合

必要なのは次のとおりです。

@"OU=([a-zA-Z\\]+)"

したがって、コードは次のようになります。

string input = @"CN=Adam West,OU=STORE,OU=COMPANY,DC=mycompany,DC=group,DC=eu";
MatchCollection ms = Regex.Matches(input, @"OU=([a-zA-Z\\]+)");

foreach (Match m in ms)
{
   Console.WriteLine(m.Groups[1].Value);// get the string in the first "(" ")"
}
于 2013-02-20T15:07:40.320 に答える