2010-10-12 15 views

Respuesta

29

¿Qué hay de:

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

Así es como funciona:

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 

Para el / son delimitadores saber dónde está el comienzo de expresiones regulares y dónde termina (y para añadir opciones) .

El grupo capturado contendrá This001.

Pero sería más rápido con un simple Substring().

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

Recursos:

+0

Nunca he usado esa sintaxis, interesante, algo para ver hoy :) – leppie

+0

No puedo encontrar ninguna documentación sobre su construcción de expresiones regulares, ¿me pueden dar una referencia? – leppie

+0

@leppie, actualizado con más información, pero debe continuar [regular-expressions.info] (http://www.regular-expressions.info/) hay mucha información sobre expresiones regulares allí. –

5

"OU =" huele a que está haciendo un directorio LDAP o Búsqueda activa y la respuesta a los resultados. Si bien Regex es una herramienta brillante, solo quería asegurarme de que también conoces las excelentes clases System.DirectoryServices.Protocols que se realizaron para analizar, filtrar y manipular solo este tipo de datos.

SearchResult, SearchResultEntry y DirectoryAttribute en particular serían los amigos que podría estar buscando. No dudo que puedas regex o subcadena tan hábilmente como el siguiente tipo pero también es bueno tener otra buena herramienta en la caja de herramientas.

¿Has probado estas clases?

+0

Esto es de un certificado. "OU =" es parte del nombre del sujeto de System.Security.Cryptography.X509Certificates. – Icerman

0

si el OU=TEST: es su requisito antes de la cadena que desea hacer coincidir, utilice esta expresión regular:

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

que expresión coincide con cualquier longitud de texto después de los dos puntos, mientras que cualquier texto antes de los dos puntos es sólo un requisito .

Puede reemplazar TEST con [A-Za-z]+ para que coincida con cualquier texto que no sea TEST, o se puede sustituir con TEST[\w]+ para adaptarse a cualquier longitud de cualquier combinación de alfabeto y los números.

\s* significa que puede haber cualquier cantidad de espacios en blanco o nada en esa posición, quítelo si no necesita dicho control.

3

una solución sin expresión regular:

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

// result == This00:1 

Regex vs de Split vs IndexOf

de 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 

Ganador: de Split

Enlaces

+0

Buena idea, pero solo "OU =" y ":" tienen un valor/longitud fija. Todo lo demás es variable. – Icerman

+0

@Icerman: La longitud no importa, si tiene al menos un ':' obtendrá todo después de ella. – BrunoLM

+0

'str.Split (new char [] {':'}, 2)' el segundo parámetro indica cuántas piezas se dividirán. Diciendo que se divida en 2 causará 'OU = jjj: kkkkkk: aaaaa: ssssss: xxxx' devolverá 2 grupos:' OU = jjj' y 'kkkkkk: aaaaa: ssssss: xxxx' – BrunoLM

Cuestiones relacionadas