如果我有一个DN字符串,像这样:
OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM
如何制作正则表达式以仅选择同时具有OU=Karen
和OU=admin
的DN?
这是正则表达式前瞻解决方案,如果它以任何顺序包含所需的部分,则匹配整个字符串,仅供参考。不过,如果您不将模式存储在某种可配置的变量中,我会坚持使用 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
或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