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

ahm*_*md0 6 regex boolean-operations

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

OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*sev 11

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


pax*_*blo 6

你意识到你不必用一个正则表达式,甚至一个正则表达式来做所有事情.

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

另外,如果你需要使用正则表达式,你可以做的是两次(每串一次),并and在一起的结果.

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

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,
Run Code Online (Sandbox Code Playgroud)

但是你必须还要担心这些节点出现在行的开头或结尾,以及各种其他边缘情况(开始或结束时的一个或两个,彼此相邻,名称如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$
Run Code Online (Sandbox Code Playgroud)

虽然,使用先进的强制正则表达式引擎,这可以减少到更小的东西(虽然它不可能更快,仅仅因为所有的前瞻性/后向跟踪).

其中一种方法可以不用复杂的正则表达式来提高就是按摩你的字符串不是需要的边界检查前略有手这样:

newString = "," + origString.replace (",", ",,") + ","
Run Code Online (Sandbox Code Playgroud)

这样它以逗号开头和结尾,其中的所有逗号都是重复的:

,OU=Karen,,OU=Office,,OU=admin,,DC=corp,,DC=Fabrikam,,DC=COM,
Run Code Online (Sandbox Code Playgroud)

那么你只需要检查更简单:

,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,
Run Code Online (Sandbox Code Playgroud)

这消除了所提到的所有潜在问题:

  • 要么在字符串的开头.
  • 要么在字符串的末尾.
  • 两者相互邻接.
  • 扩展名称,如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()
Run Code Online (Sandbox Code Playgroud)

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

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