说,如果我有一个 DN 字符串,是这样的:
OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM
如何制作正则表达式以仅选择同时具有OU=Karen
和的 DN OU=admin
?
说,如果我有一个 DN 字符串,是这样的:
OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM
如何制作正则表达式以仅选择同时具有OU=Karen
和的 DN OU=admin
?
这是正则表达式前瞻解决方案,如果它包含任何顺序的所需部分,则匹配整个字符串以供参考。如果您不将模式存储在某种可配置变量中,我会坚持使用 nhahtdh 的解决方案。
/^(?=.*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
您意识到您不必使用单个正则表达式甚至一个正则表达式来做所有事情。
正则表达式非常适合捕获输入类,但是,如果您有两个完全固定的字符串,您可以contains()
对它们都使用 -type 方法,然后再and
使用结果。
或者,如果您需要使用正则表达式,您可以执行两次(每个字符串一次)并将and
结果放在一起。
如果您需要使用单个正则表达式来执行此操作,您可以尝试以下操作:
,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,
但是您还必须担心这些节何时出现在行的开头或结尾,以及各种其他边缘情况(一个或两个在开头或结尾,彼此相邻,名称如Karen7
or administrator-lesser
,以及很快)。
不得不考虑所有可能性最终可能会导致一些可怕的事情,例如:
^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$
虽然,使用先进的 enouge 正则表达式引擎,这可能会简化为更小的东西(尽管它不太可能更快,仅仅是因为所有的前瞻性/回溯)。
在没有复杂正则表达式的情况下可以改进的一种方法是事先稍微按摩你的字符串,这样就不需要边界检查:
newString = "," + origString.replace (",", ",,") + ","
以便它以逗号开头和结尾,并且其中的所有逗号都重复:
,OU=Karen,,OU=Office,,OU=admin,,DC=corp,,DC=Fabrikam,,DC=COM,
然后你只需要检查更简单的:
,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,
这消除了所有提到的潜在问题:
Karen2
意外匹配。可能最好的方法(如果您的语言允许)是简单地将字符串拆分为逗号并检查它们,例如:
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()
这既忽略了它们可能出现的顺序,又绕过了检测边缘情况可能需要的任何正则表达式“体操”。
它还具有可能比等效的正则表达式更具可读性的优点:-)
如果您必须使用正则表达式,您可以使用
/OU=Karen.*?OU=admin|OU=admin.*?OU=Karen/
您可以contains()
,或indexOf()
与条件的数量一样多次来检查确切的字符串。不需要正则表达式。
可扩展的正则表达式(因为它可以支持更多条件)可能会向前看,但我怀疑它会表现得更好。
如果你想对同一个字符串多次执行这种类型的操作,并且字符串上有很多标记,那么你可以考虑解析字符串并存储在一些数据结构中。
不,除非您使用的是vi
:它有一个\&
运算符
/(OU=Karen.*OU=admin|ou=admin.*OU=Karen)/
不过,这可能足够接近或类似。
您可以使用类似 (OU\=Karen