2017-06-06 15 views
0

x文字からy文字までをn個の長さの文字列をより小さな部分に分割することなく読むことができるかどうかを知りたいと思います。特定の文字との間で文字列を読む

私はAD CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=comにパスするために、次の文字列を持っている、と私は=または,最初で分割せずに、ちょうどそれのsomeName一部を読むことができるようにしたいと思います。どのように達成するのですか?

理由は、私は今それをやっているように、グループの比較を行う必要がないこと、である:

SearchResult t1 = search.FindOne(); 
foreach (string s in t1.Properties["memberof"]) 
{ 
    foreach (string g in groups) 
    { 
     if (s.ToLower().Contains(g.ToLower())) 
     { 
      // do something 
     } 
    } 
} 

私はむしろ対等にif節になるだろうが、私は常に分割する必要はありません上のパス/グループを2回配列に追加します。それ、どうやったら出来るの?

+2

を使用します_は_私はそれを得るいけない「​​私はグループの比較を行う必要はありません」、 'groups'は何ですか? –

+0

@TimSchmelterあるユーザーが特定のグループに属しているかどうかを確認するために、権限を確認するために、 'groups'は有効なグループの配列です。また、私が言ったように、可能であれば配列の使用を避けたいと思います。プログラミングは比較的新しいので、LINQなどの構文はすべてわかりません。 – EInherjar

答えて

4

IndexOfSubstringで単純な文字列操作を使用する:(それはコンマで終了していないので)この単純な例は、CN=エントリが行の最後だった場合は失敗するでしょう

string s = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 

const string prefix = "CN="; 
int start = s.IndexOf(prefix); 
if (start >= 0) 
{ 
    string value = s.Substring(start + prefix.Length, s.IndexOf(',', start) - prefix.Length); 
    Console.WriteLine(value); 
} 

注こと。最初に、IndexOfの呼び出しの戻り値を調べることで確認できます。

しかし、この場合は、とにかくCN=が最初になります。

0

Splitを使用すると、のいずれかのキーがと一致するかどうかを調べることができます。

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
var prefix = "CN"; 
var searchValue = "someName"; 
var contains = val.Split(',').Any(value => value.Split('=')[0] == prefix && value.Split('=')[1] == searchValue); 

値が検索値と等しいかどうかをチェックすると、ちょうど値を返すことができます。私はまだあなたにもかかわらず、Splitを使用

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
var prefix = "CN"; 
var foundValue = val.Split(',').FirstOrDefault(value => value.Split('=')[0] == prefix)?.Split('=')[1]; 

は、あなたが、私はそれは素敵な1つのライナーを作ると思うようにそれを使用したくないと述べました。

+0

それはグループ名の由来なので、 '' CN = "'接頭辞ですが、 – EInherjar

+0

@EInherjar Iveは 'CN ='接頭辞を探すコードを変更しました。それとも私はあなたを誤解しましたか? – NtFreX

+0

@EInherjarこのソリューションは、cnが文字列のどこにあっても動作します。 – NtFreX

0

正しいオフセットを見つけるためにString.IndexOfを使用してから、String.SubStringを使用して必要な部分を読み取ることができます。

const string input = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
const string start = "CN="; 
const string stop = ","; 

int startIndex = input.IndexOf(start, 0); 
int stopIndex = input.IndexOf(stop, startIndex); 

var extracted = input.Substring(startIndex + start.Length, stopIndex - startIndex - start.Length); 

Console.WriteLine(extracted); 

.net Fiddle

PS:多分、あなたの特別なユースケースのためのIs there a .NET class that can parse CN= strings out of LDAP?を見てみましょう!

1

あなたはグループの比較を行っている場合、私はSystem.DirectoryServices.AccountManagement名前空間

PrincipalContext Context = new PrincipalContext(ContextType.Domain, ""); 
UserPrincipal Usr = UserPrincipal.FindByIdentity(Context, "User"); 
GroupPrincipal G = GroupPrincipal.FindByIdentity(Context, "Group"); 

if(Usr.IsMemberOf(G)) { 

} 
+0

これはうまくいくが、ADにまだ存在しないグループが許可されたグループのアレイ内に存在すると、ブレークする。これを回避する方法はありますか? – EInherjar

関連する問題