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.
,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 :-)
¡Gracias por la explicación! – ahmd0