【问题标题】:Matching strings with and without escape characters with RegEx使用 RegEx 匹配带有和不带有转义字符的字符串
【发布时间】:2019-09-12 18:24:26
【问题描述】:

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

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

字符串示例:

  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 中创建对象。

【问题讨论】:

  • 您可以使用-Replace 运算符删除\。 $OU -Replace "\\".
  • 您可以在拆分 -split ',?..=\\?' 中添加斜杠作为可选,类似于您处理逗号的方式

标签: regex powershell split


【解决方案1】:

您只需在当前的正则表达式中添加斜杠作为可选内容,只需进行最小的更改。你已经用前导逗号做了类似的事情

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

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

【讨论】:

  • 谢谢马特!这就是我一直在寻找的。​​span>
【解决方案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

【讨论】:

  • 感谢您的快速回答!我对正则表达式相当陌生,请有这么多人愿意提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
相关资源
最近更新 更多