Regex 我可以在正则表达式中使用布尔AND条件吗?
比如说,如果我有一个DN字符串,类似这样:Regex 我可以在正则表达式中使用布尔AND条件吗?,regex,boolean-operations,Regex,Boolean Operations,比如说,如果我有一个DN字符串,类似这样: OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM 如何生成正则表达式以仅选择同时具有OU=Karen和OU=admin的DNs?您可以包含(),或索引()检查精确字符串的条件数的倍。不需要正则表达式 可扩展的正则表达式(因为它可以支持更多的条件)可能有前瞻性,但我怀疑它是否会表现得更好 如果您想在相同的不,除非您使用 VI>代码>:它有 \ < /代码>运算符< /P> /(OU=Karen
OU=Karen,OU=Office,OU=admin,DC=corp,DC=Fabrikam,DC=COM
如何生成正则表达式以仅选择同时具有OU=Karen
和OU=admin
的DNs?您可以包含()
,或索引()
检查精确字符串的条件数的倍。不需要正则表达式
可扩展的正则表达式(因为它可以支持更多的条件)可能有前瞻性,但我怀疑它是否会表现得更好
如果您想在<强>相同的 < P>不,除非您使用<代码> VI>代码>:它有<代码> \ < /代码>运算符< /P>
/(OU=Karen.*OU=admin|ou=admin.*OU=Karen)/
不过,这可能足够接近,或者类似。如果必须使用正则表达式,可以使用
/OU=Karen.*?OU=admin|OU=admin.*?OU=Karen/
你意识到你不必用一个正则表达式做任何事情,甚至一个正则表达式 正则表达式非常适合捕捉输入类,但如果有两个完全固定的字符串,则可以对这两个字符串使用
contains()
-type方法,然后使用和来获取结果
或者,如果您需要使用正则表达式,您可以使用两次(每个字符串一次),然后将结果一起和
如果需要使用单个正则表达式,可以尝试以下操作:
,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,
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()
但是,您还必须担心这些节何时出现在行首或行尾,以及各种其他边缘情况(一个或两个出现在行首或行尾,两个相邻,名称如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 regex引擎,这可能会缩小到更小(尽管不太可能更快,因为所有的前瞻性/回溯性)
一种不用复杂正则表达式就可以改进的方法是在手前轻轻按摩字符串,这样就不需要进行边界检查:
newString = "," + origString.replace (",", ",,") + ","
因此,它以逗号开始和结束,并且其中的所有逗号都是重复的:
,OU=Karen,,OU=Office,,OU=admin,,DC=corp,,DC=Fabrikam,,DC=COM,
然后,您只需检查更简单的:
,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,
这消除了所有提到的潜在问题:
- 要么在字符串的开头
- 在字符串的末尾
- 两者邻接
- 像
Karen2
这样的扩展名被意外匹配
最好的方法可能是(如果您的语言允许的话)简单地拆分逗号上的字符串并检查它们,例如:
,OU=Karen,.*,OU=admin,|,OU=admin,.*,OU=Karen,
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这是regex前瞻解决方案,如果它包含任何顺序的必需部分仅供参考,则匹配整个字符串。但是,如果您不将模式存储在某种可配置变量中,我将坚持使用NHAHDH的解决方案
/^(?=.*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
有时,对于“如何做X?”这个问题的最佳答案是“不要做X,而是做Y”。REs是一个很棒的工具,但是链锯也是——我仍然不会用它们来敲钉子:-)我不能使用任何编程语言。它一定是regexp。对不起。同样,正如我上面所说,感谢您的解释,但这必须是一个regexp。@ahmd0,然后您可以查看我提供的regex,考虑我警告过的所有可能性。或者,如果您的regex引擎足够先进,Eugene的解决方案可能是最好的。+1。忘记了分裂和检查(我只考虑在我的帖子中重复检查)。不确定,但是这样的性能可能会更好。@ AHDM0,我还增加了你应该检查的另一种可能性,当然是预先按摩字符串(当然是临时字符串)。为了使操作更简单。大家好,欢迎来到Stack Overflow。这可能很好地回答了这个问题,但一点解释总是一个好主意。很多S/O新手可能会从您那里学到一两件事,而对您来说显而易见的事情对他们来说并不重要。