替换,直到在PowerShell中找到模式

时间:2018-05-02 17:33:11

标签: regex powershell

我一直在尝试转换以下字符串:

CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM

为:

FR.CONTOSO.COM

作为第一步,我尝试删除所有内容,直到",DC"图案。

我以为我可以使用非贪婪的"。+?"匹配所有东西直到第一个",DC"图案:

$str = 'CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM'
$str -replace '.+?,DC', ''

返回:

=COM

任何想法为什么即使使用非贪婪的版本它也只获得最后一个? 我怎么能这样做?

5 个答案:

答案 0 :(得分:2)

只需拆分字符串:

$parts = ('CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM' -split ',')
$newString = '{0}.{1}.{2}' -f $parts[-3].split('=')[1], $parts[-2].split('=')[1], $parts[-1].split('=')[1]

答案 1 :(得分:2)

好的,所以我接受了@ EBGreen的建议并决定制作一个完成所有工作的功能:

#Requires -Version 4
Function ConvertFrom-DistinguishedName
{
    [CmdletBinding()]
    [OutputType('System.Management.Automation.PSCustomObject')]
    Param(
        [Parameter(Position = 0, Mandatory)]
        [Alias('DistinguishedName', 'Name')]
        [ValidatePattern('^CN=.+?,(OU=.+?,)+DC=.+$')]
        [string]
        $Path
    )
    $local:ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop
    $WS = $Path -split ',' # working set

    $User = $WS[0] -replace 'CN='
    $Domain = $WS.Where({$PSItem.StartsWith('DC=')}).ToLower() -replace 'dc=' -join '.'
    $OU = $WS.Where({$PSItem.StartsWith('OU=')}) -replace 'OU='
    [array]::Reverse($OU)

    [pscustomobject]@{
        'User'   = $User
        'Domain' = $Domain
        'OU'     = $OU -join '\'
    }
}

PS C:\> ConvertFrom-DistinguishedName 'CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM'

User     Domain         OU
----     ------         --
John Doe fr.contoso.com HQ\Department\Support\IT

最终结果?这会将您的可分辨AD名称转换为您可以轻松使用的PSCustomObject。

答案 2 :(得分:1)

要从Distinguishedname中取出域名,您需要使用-Split。最后,我们可以使用-join来插入'。'在DC之间

这会将您的域名字符串存储到$domain

$dn = "CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM"
$domain = $dn -Split "," | ? {$_ -like "DC=*"}
$domain = $domain -join "." -replace ("DC=", "")

Write-Host "Current Domain: " $domain

答案 3 :(得分:1)

您应该使用^从头开始。

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var searchBar: UISearchBar!

override func viewDidLoad() {
    conteudo = ["Augusto","Luis","Joao","Marina","Taina","Evandra","Miguel","Daniela","Luciano","Patricia","Jose","Vinicius","John","William"]

    currentConteudo = conteudo
    currentConteudo.sort()

    tableView.dataSource = self
    tableView.delegate = self
    tableView.tableHeaderView = searchBar
    tableView.estimatedSectionHeaderHeight = 50
    searchBar.delegate = self
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return currentConteudo.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellSearchCustomer")!
    cell.textLabel?.text = currentConteudo[indexPath.row]
    return cell
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    return searchBar
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return UITableViewAutomaticDimension
}

答案 4 :(得分:1)

由于没有人为解释行为而烦恼:

替换操作会替换字符串中{?1}}出现的每个,因此它首先删除.+?,DC,然后继续替换中断并删除{{1}然后CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC,只留下=FR,DC

要避免此行为,您需要将表达式锚定在字符串的开头(=CONTOSO,DC),正如其他人已经建议的那样。用剩余的=COM代替点的第二个替换可以菊花链式连接到第一个,所以你只需要一个语句:

^