2010-10-12 17 views

risposta

29

Che dire:

/OU=.*?:(.*)/ 

Ecco come funziona:

OU= // Must contain OU= 
. // Any character 
* // Repeated but not mandatory 
? // Ungreedy (lazy) (Don't try to match everything) 
: // Match the colon 
( // Start to capture a group 
    . // Any character 
    * // Repeated but not mandatory 
) // End of the group 

Per la / sono delimitatori di sapere dove l'inizio regex e dove finisce (e per le opzioni di aggiunta) .

Il gruppo catturato conterrà This001.

Ma sarebbe più veloce con un semplice Substring().

yourString.Substring(yourString.IndexOf(":")+1); 

Risorse:

+0

Non ho mai usato quella sintassi, interessante, qualcosa da guardare oggi :) – leppie

+0

Non riesco a trovare alcuna documentazione sul costrutto regex, puoi fornire un riferimento? – leppie

+0

@leppie, aggiornato con ulteriori informazioni, ma dovresti andare su [regular-expressions.info] (http://www.regular-expressions.info/) ci sono molte informazioni sulle regex lì. –

5

"OU =" puzza come si sta facendo una Directory o LDAP Ricerca attiva e rispondendo ai risultati. Mentre regex è uno strumento geniale, volevo solo assicurarmi che anche tu sia a conoscenza delle eccellenti classi System.DirectoryServices.Protocols create per analizzare, filtrare e manipolare solo questo tipo di dati.

Il SearchResult, SearchResultEntry e DirectoryAttribute in particolare sarebbero gli amici che potreste cercare. Non dubito che sia possibile regex o sottostringa in modo intelligente come il prossimo, ma è anche bello avere un altro buon strumento nella casella degli strumenti.

Hai provato queste lezioni?

+0

Questo proviene da un certificato. "OU =" fa parte del nome del soggetto da System.Security.Cryptography.X509Certificates. – Icerman

0

se il OU=TEST: è il vostro requisito prima la stringa che si desidera far corrispondere, utilizzare questa espressione regolare:

(?<=OU\s*=\s*TEST\s*:\s*).* 

che regex trova qualsiasi lunghezza del testo dopo i due punti, mentre il testo prima dei due punti è solo un requisito .

È possibile sostituire TEST con [A-Za-z]+ per adattarsi a qualsiasi testo diverso TEST, oppure è possibile sostituire con TEST[\w]+ per adattarsi a qualsiasi lunghezza di ogni combinazione di lettere e numeri.

\s* significa che potrebbe essere un qualsiasi numero di spazi bianchi o nulla in quella posizione, rimuoverlo se non è necessario un tale controllo.

3

una soluzione senza espressioni regolari:

var str = "OU=TEST:This00:1"; 
var result = str.Split(new char[] { ':' }, 2)[1]; 

// result == This00:1 

Regex vs Spalato vs IndexOf

Split

var str = "OU=TEST:This00:1"; 

var sw = new Stopwatch(); 

sw.Start(); 
var result = str.Split(new char[] { ':' }, 2)[1]; 
sw.Stop(); 

// sw.ElapsedTicks == 15 

Regex

var str = "OU=TEST:This00:1"; 

var sw = new Stopwatch(); 

sw.Start(); 
var result = (new Regex(":(.*)", RegexOptions.Compiled)).Match(str).Groups[1]; 
sw.Stop(); 

// sw.ElapsedTicks == 7000 (Compiled) 

IndexOf

var str = "OU=TEST:This00:1"; 

var sw = new Stopwatch(); 

sw.Start(); 
var result = str.Substring(str.IndexOf(":") + 1); 
sw.Stop(); 

// sw.ElapsedTicks == 40 

Vincitore: Split

Link

+0

Buona idea, ma solo "OU =" e ":" hanno valore fisso/lunghezza. Tutto il resto è variabile. – Icerman

+0

@Icerman: la lunghezza non ha importanza, se ha almeno uno ':' otterrà tutto dopo di essa. – BrunoLM

+0

'str.Split (new char [] {':'}, 2)' il secondo parametro indica quanti pezzi sarà diviso. Dire di dividere in 2 causerà 'OU = jjj: kkkkkk: aaaaa: ssssss: xxxx' restituirà 2 gruppi:' OU = jjj' e 'kkkkkk: aaaaa: ssssss: xxxx' – BrunoLM

Problemi correlati