如何制作正则表达式以排除带括号的字符串

时间:2014-04-07 18:52:58

标签: regex powershell powershell-v3.0

我有以下SDDL:

O:BAG:BAD:(A;;CCDCLCSWRP;;;BA)(A;;CCDCSW;;;WD)(A;;CCDCLCSWRP;;;S-1-5-32-562)(A;;CCDCLCSWRP;;;LU)(A;;CCLCRP;;;S-1-5-21-4217728705-3687557540-3107027809-1003)

不幸的是我一直这样:

(A;;CCDCLCSWRP;;;BA)(A;;CCDCSW;;;WD)

我想要的只是(A;;CCDCSW;;;WD)

我的正则表达式是:(\(A;.+;WD\)):找到" (A;"一些字符以" ;WD)"

结尾

我已经尝试过让比赛变得懒惰而且我已经尝试排除" )("基于stackoverflow正则表达式标记搜索的字符对,查找其他人已回答类似问题的示例。

我真的很困惑为什么排除这些不适用的工作:

(\(A;.+[^\(\)]*.+;WD\)):找到" (A;"其次是一些角色,其中没有一个是" )(''其次是以" ;WD)"

结尾的其他字符

这是我对使用负面看法的猜测:

(\(A;.+^((?!\)\().).+;WD\)) 

并不匹配任何东西。

我还在PowerShell v3.0中使用以下代码执行此操作:

$RegExPattern = [regex]"(\($ACE_Type;.*;$ACE_SID\))+?"
if ($SDDL -match $RegExPattern) {
    $MatchingACE = $Matches[0]

此实例中的$ACE_Type = "A"$ACE_SID = "WD"

2 个答案:

答案 0 :(得分:2)

您几乎拥有第二个正则表达式模式的解决方案。问题是你包含了太多.个通配符。这应该是你所需要的:

A;[^()]+;WD

当然,如果您只想在A;;WD之间捕获字符串:

A;([^()]+);WD

然后只需用\1替换。

答案 1 :(得分:1)

我对此进行了简化,然后添加了外观,以便您只匹配预期的字符串(在A;...;WD之间)。这看起来是A;,然后匹配1个非括号字符,同时展望;WD

(?<=A;)[^()]+(?=;WD)

Regex101

相关问题