拆分模块通常用于将Active Directory专有名称和规范名称拆分为RDN,从而方便地忘记在OU和CN中可能使用的转义分隔符,如下所示:

带有转义逗号的专有名称示例:

CN=Test User,OU=Comma\,Test,OU=Test,DC=domain,DC=com

带有斜杠转义的规范名称示例:
Domain.com/Test/Slash\/Test/Test User

互联网上有几个分裂的例子甚至没有提到这个陷阱,该陷阱可能在很长的时间内有效,但迟早会给解决这个编程缺陷带来很多麻烦。

我认为没有一种简单的方法可以使用正则表达式正确地分割转义的字符串(另请参见:是否存在包含转义序列的字符串的纯正则表达式拆分?)。

最佳答案

总结和补充现有的,有用的答案:

如果您不必担心\\作为转义的\ 出现在输入中,则

  • 效果很好。
    如果存在\\,则解决方案会将,中的\\,误解为已转义(而不是先后转义的\和未转义的,)。
  • mjolinor's answer使用更复杂的正则表达式解决了问题。

  • 另外,您可能想在分割
    删除转义字符;以iRon's own answer提供的正则表达式为基础,并使用正则表达式-replace添加\\(.)操作:
    PS> 'foo,bar\,baz,bang\\,last' -split '(?<=(?<!\\)(?:\\\\)*),' -replace '\\(.)', '$1'
    foo
    bar,baz
    bang\
    last
    

    这是一个简单实用程序函数,它包装了上述内容,并带有可配置的分隔符和转义字符。
    function Split-Text {
      param(
          [Parameter(Mandatory=$True)] [string] $Text,
          [Parameter(Mandatory=$True)] [string] $Separator,
          [string] $EscapeChar = '\'
      )
      $Text -split
          ('(?<=(?<!{0})(?:{0}{0})*){1}' -f [regex]::Escape($EscapeChar), [regex]::Escape($Separator)) `
              -replace ('{0}(.)' -f [regex]::Escape($EscapeChar)), '$1'
    }
    
    # Sample call - yields the same as above.
    Split-Text 'foo,bar\,baz,bang\\,last' ','
    
    # With "/" as the separator - analogous output.
    Split-Text 'foo/bar\/baz/bang\\/last' '/'
    

    关于powershell - (PowerShell)使用转义符分隔的拆分字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21782505/

    10-12 01:10
    查看更多