我一直在尝试转换以下字符串:
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
任何想法为什么即使使用非贪婪的版本它也只获得最后一个? 我怎么能这样做?
答案 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
代替点的第二个替换可以菊花链式连接到第一个,所以你只需要一个语句:
^