我可以在正则表达式中使用布尔AND条件吗?

时间:2012-05-31 04:32:17

标签: regex boolean-operations

说,如果我有一个DN字符串,就像这样:

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

如何使正则表达式仅选择同时具有OU=KarenOU=admin的DN?

6 个答案:

答案 0 :(得分:10)

这是正则表达式先行解决方案,如果它包含任何顺序的所需部分仅供参考,则匹配整个字符串。如果你不将模式存储在某种可配置的变量中,我会坚持使用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

答案 1 :(得分:6)

您意识到您不必使用单个正则表达式执行所有内容,甚至一个正则表达式。

正则表达式非常适合捕获输入类,但是,如果您有两个完全固定的字符串,则可以对它们使用contains() - 类型方法,然后and结果。

或者,如果您需要使用正则表达式,则可以那个两次(每个字符串一次)和and结果。

如果您需要使用单个正则表达式,可以尝试以下方法:

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

但是你还要担心这些节点出现在行的开头或结尾,以及各种其他边缘情况(开始或结束时的一个或两个,彼此相邻,如同名字一样) Karen7administrator-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$
但是,使用先进的强制正则表达式引擎,可以将其缩小到更小的值(尽管它不太可能更快,仅仅因为所有前瞻性/后向跟踪)。

在没有复杂的正则表达式的情况下可以进行改进的一种方法是在事先按摩你的字符串,以便不需要边界检查:

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()

这两者都忽略了它们可能出现的顺序,并绕过了检测边缘情况可能需要的任何正则“体操”。

它的优点是可能比同等的正则表达式更具可读性: - )

答案 2 :(得分:3)

如果必须使用正则表达式,则可以使用

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

答案 3 :(得分:1)

您可以contains()indexOf()与检查确切字符串的条件数一样多次。不需要正则表达式。

可扩展的正则表达式(因为它可以支持更多条件)可能会有前瞻性,但我怀疑它会表现得更好。

如果要在相同字符串上多次执行此类操作,并且字符串上有许多标记,则可以考虑解析字符串并存储在某些数据结构中。 / p>

答案 4 :(得分:0)

不,除非您使用的是vi:它有一个\&运算符

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

这可能足够接近或类似。

答案 5 :(得分:-1)

你可以使用类似的东西(OU \ = Karen