使用RegEx匹配带有和不带有转义符的字符串

时间:2019-04-23 14:21:41

标签: regex powershell split

我与Active Directory对象具有不同的专有名称,并且在将这些dn拆分为简单名称时需要过滤掉转义字符。

我已经有一个-split的PowerShell字符串,但这不能过滤掉转义字符。我已经尝试过使用正向后置式的正则表达式,但是在这种情况下我确实需要类似可选的正向后置式的东西吗?也许我只是想太复杂了。

字符串示例:

  1. OU=External,OU=T1,OU=\+TE,DC=test,DC=dir
  2. OU=\#External,OU=T1,OU=\+TE,DC=test,DC=dir
  3. OU=\+External,OU=T1,OU=\+TE,DC=test,DC=dir

由于+#被转义了,但是它们是这些对象的实际名称,我需要删除转义符

使用以下PowerShell,可以获取对象的名称

($variable -split ',*..=')[1]

实际结果:

  1. External
  2. \#External
  3. \+External

预期结果:

  1. External
  2. #External
  3. +External

可以在$variable -creplace "REGEX"中使用正则表达式,但是我找不到适合所有情况的正则表达式。

我的尝试是:(?<=OU=\\).+?(?=,OU=),但只有\在这里才匹配

在Active Directory中创建对象时,我需要这个名称。

2 个答案:

答案 0 :(得分:2)

只需最少的更改,您就可以在当前正则表达式中将斜杠添加为可选。您已经用逗号分隔了

"OU=\#External,OU=T1,OU=\+TE,DC=test,DC=dir" -split ',?..=\\?'

如果您只打算进入第一部分,则可以走得更远,但这可以回答您的基本问题。可能还有其他效率,但可能不值得。

答案 1 :(得分:2)

要从DN中提取第一个OU名称,同时删除可选的前导反斜杠,可以使用如下正则表达式:

OU=\\?(.*?), *..=.*$

演示:

$dn1 = 'OU=External,OU=T1,OU=\+TE,DC=test,DC=dir'
$dn2 = 'OU=\#External,OU=T1,OU=\+TE,DC=test,DC=dir'
$dn3 = 'OU=\+External,OU=T1,OU=\+TE,DC=test,DC=dir'

$dn1 -replace 'OU=\\?(.*?), *..=.*$', '$1'  # output: External
$dn2 -replace 'OU=\\?(.*?), *..=.*$', '$1'  # output: #External
$dn3 -replace 'OU=\\?(.*?), *..=.*$', '$1'  # output: +External