2012-05-31 24 views

Respuesta

10

Ésta es la solución de expresiones regulares de búsqueda hacia delante, haciendo coincidir la cadena completa si contiene piezas necesarias en cualquier orden sólo para la referencia. Si no almacena el patrón de algún tipo de variables configurables, me quedo con la solución de nhahtdh, sin embargo.

/^(?=.*OU=Karen)(?=.*OU=admin).*$/ 

^  - line start 
(?=  - start zero-width positive lookahead 
.*  - anything or nothing 
OU=Karen - literal 
)  - end zero-width positive lookahead 
     - place as many positive or negative look-aheads as required 
.*  - the whole line 
$  - line end 
+0

¡Gracias por la explicación! – ahmd0

1

Puede o indexOf() tantas veces como el número de condiciones para verificar la cadena exacta. No hay necesidad de expresiones regulares.

Regex extensible (ya que puede soportar más condiciones) puede ser posible con la vista al frente, pero dudo que funcione mejor.

Si desea realizar este tipo de acción varias veces en la cadena misma, y hay muchos tokens en la cadena, entonces puede considerar analizar la cadena y almacenarla en alguna estructura de datos.

+0

mi humilde opinión no es la respuesta a la pregunta pero tienes razón. – rekire

+0

A veces, la mejor respuesta a la pregunta "¿Cómo IX?" Es "No hagas X, haz Y en su lugar". Los RE son una herramienta fantástica, pero también lo son las motosierras. Todavía no los usaría para golpear un clavo: -) – paxdiablo

+0

No puedo usar ningún lenguaje de programación. Debe ser la expresión regular. Lo siento. – ahmd0

0

No, a menos que estés usando vi: tiene un operador \&

/(OU=Karen.*OU=admin|ou=admin.*OU=Karen)/ 

Esto podría ser lo suficientemente cerca, sin embargo, o similar.

3

Si tiene que usar una expresión regular, puede utilizar

/OU=Karen.*?OU=admin|OU=admin.*?OU=Karen/ 
+0

+1 para la expresión regular no codiciosa – rekire

6

se da cuenta que no tiene que hacer todo lo con una sola expresión regular, o incluso uno expresiones regulares.

Las expresiones regulares son muy buenas para capturar clases de entrada pero, si tiene dos cadenas totalmente fijas, puede usar un método de tipo para ambos y luego and los resultados.

Alternativamente, si necesita usar expresiones regulares, puede hacer que dos veces (una por cadena) y and los resultados juntos.

Si tiene que hacerlo con una sola expresión regular, podría intentar algo como:

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen, 

pero usted entonces tiene que preocuparse también de cuando esas estrofas aparecen al principio o al final de la línea y todo tipo de otros casos extremos (uno o ambos al principio o al final, ambos al lado del otro, nombres como Karen7 o administrator-lesser, y así sucesivamente).

Tener para permitir todos posibilidades probablemente terminará con algo monstruoso como:

^OU=Karen(,[^,]*)*,OU=admin,| 
^OU=Karen(,[^,]*)*,OU=admin$| 
,OU=Karen(,[^,]*)*,OU=admin,| 
,OU=Karen(,[^,]*)*,OU=admin$| 
^OU=admin(,[^,]*)*,OU=Karen,| 
^OU=admin(,[^,]*)*,OU=Karen$| 
,OU=admin(,[^,]*)*,OU=Karen,| 
,OU=admin(,[^,]*)*,OU=Karen$ 

aunque, con un motor enouge expresiones regulares avanzada, esto puede ser reducible a algo más pequeño (aunque sería poco probable para ser más rápido, simplemente por todo el avance/retroceso).

Una manera en que podría ser mejorada sin una expresión regular compleja es dar masajes a su cadena un poco de antemano por lo que no son necesarios que los controles de frontera:

newString = "," + origString.replace (",", ",,") + "," 

de manera que se inicia y termina con una coma y todas las comas dentro de ella se duplican:

,OU=Karen,,OU=Office,,OU=admin,,DC=corp,,DC=Fabrikam,,DC=COM, 

Entonces sólo tiene que comprobar la mucho más simple:

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen, 

y esto elimina todos los problemas potenciales mencionados:

  • ya sea al inicio de la cadena.
  • al final de la cadena.
  • colindando entre sí.
  • nombres extendidos como Karen2 que coinciden accidentalmente.

Probablemente el mejor manera de hacer esto (si el idioma lo permite) es simplemente dividir la cadena de comas y examinarlos, algo así como:

str = "OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM" 
elems[] = str.splitOn(",") 

gotKaren = false 
gotAdmin = false 
for each elem in elems: 
    if elem = "OU=Karen": gotKaren = true 
    if elem = "OU=admin": gotAdmin = true 

if gotKaren and gotAdmin: 
    weaveYourMagicHere() 

Este tanto ignora el orden en el que pueden aparecer y pasa por alto cualquier "gimnasia" regex que pueda ser necesaria para detectar los casos extremos.

También tiene la ventaja de ser probablemente más legible que la expresión regular equivalente :-)

+0

Una vez más, como dije antes, gracias por la explicación, pero esto tiene que ser solo una expresión regular. – ahmd0

+0

@ ahmd0, entonces puedes ver la expresión regular que di, teniendo en cuenta todas las posibilidades contra las que advertí. O bien, siempre que su motor regex sea lo suficientemente avanzado, la solución de Eugene es probablemente la mejor. – paxdiablo

+0

+1. Olvidé sobre la división y el control (solo considero esto para verificaciones repetidas en mi publicación). No estoy seguro, pero el rendimiento puede ser mejor de esta manera. – nhahtdh

-1

Usted puede usar algo como (OU \ = Karen

+1

Hola y bienvenidos a Stack Overflow. Esto bien puede responder a la pregunta, pero un poco de explicación siempre es una buena idea. Hay montones de novatos en S/O que pueden aprender una cosa o dos de ti, y lo que puede ser obvio para ti, no será para ellos. –

Cuestiones relacionadas