我有一個字串,它代表 Active Directory 的多個 DN,但已用逗號分隔,而不是;
字串:
CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal,
CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal,
CN=Operators,ou=App2,ou=groups,dc=pkldap,dc=internal
我正在嘗試撰寫一個正則運算式,它會匹配兩者ou=App1而不是匹配,ou=App2但也會使,afterdc=internal成為;
這可能嗎?
結果將是:
CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal;
CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal;
uj5u.com熱心網友回復:
使用 #strip 和 #sub 清理 LDIF 資料
確實,“正確”的答案是首先獲得有效的LDIF,然后使用像Net::LDAP這樣的 gem 對其進行決議。但是,您想要對現有檔案進行的更改是相當微不足道的。例如,我們將首先使用here-document 文字將您問題中的字串資料分配給名為ldif的變數:
ldif = <<~'LDIF'
CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal,
CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal,
CN=Operators,ou=App2,ou=groups,dc=pkldap,dc=internal
LDIF
您現在可以使用String#each_line修改和匹配您想要迭代的字串中的行,以及String#gsub和正則運算式前瞻斷言,以在 #each_line 的輸出上使用Array#select查找和收集您想要的行,以及將結果存盤到matching_apps陣列中。
這一切聽起來比實際復雜得多。考慮以下方法鏈,它實際上只是為了便于閱讀而包裝的單行代碼:
matching_apps =
ldif.each_line.select { _1.match? /ou=App1(?=[,;]?$?)/ }
.map { _1.strip.sub /[,;]$/, ";" }
#=>
["CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal;",
"CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal;"]
使用String#strip和String#sub將有助于確保所有行都按照您想要的方式進行規范化,包括尾隨分號。但是,這可能會導致后續步驟出現問題,因此我可能建議也洗掉那些尾隨分號。
注意:如果您只想解決最初發布的直接問題,您可以在此處停止閱讀。答案的其余部分涵蓋了與資料規范化相關的其他注意事項,并提供了一些示例,說明您可能還希望如何以及為什么要去除分號。
為什么以及如何在沒有分號的情況下進行規范化
您可以用空字串(例如)替換#sub 中的最后一個替換,""以洗掉結尾的分號(如果存在)。現在不使用分號進行規范化可以省去您稍后在從Array#select遍歷存盤在match_apps中的結果陣列時必須再次清理這些行的麻煩。
例如,如果您需要用逗號重新連接行,在后續步驟中將行插入其他 String 物件中,或者在存盤的分號可能會出人意料的情況下執行任何操作,最好盡早處理而不是稍后處理。如果你真的需要尾隨分號,很容易使用String#concat或其他形式的字串插值將它們添加回來,但在字串中包含意外字符可能是意外錯誤的來源,除非你確定,否則最好避免這些錯誤最后你總是需要那個分號。
示例 1:可能意外分號的輸出
例如,假設您想使用結果來格式化命令列客戶端的輸出,在該客戶端中不需要尾隨分號。以下作業很好,因為分號已經被剝離:
matching_apps =
ldif.each_line.select { _1.match? /ou=App1(?=[,;]?$?)/ }
.map { _1.strip.sub /[,;]$/, "" }
printf "Make the following calls:\n\n"
matching_apps.each_with_index do |dn, idx|
puts %(#{idx.succ}. ldapsearch -D '#{dn}' [opts])
end
這將列印出:
Make the following calls:
1. ldapsearch -D 'CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal' [opts]
2. ldapsearch -D 'CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal' [opts]
無需先洗掉任何可能不適用于列印的命令、工具或其他輸出的尾隨分號。
使用逗號和分號重新連接的示例
另一方面,如果需要,您可以使用逗號或分號輕松地重新加入 Array 元素。考慮以下兩個示例:
matching_apps.join ", "
#=> "CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal, CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal"
p format("(%s)", matching_apps.join("; "))
#=> "(CN=Admins,ou=App1,ou=groups,dc=pkldap,dc=internal; CN=Auditors,ou=App1,ou=groups,dc=pkldap,dc=internal)"
牢記靈活性
如果 Array 中的 String 物件仍然有尾隨分號,那么您必須對它們做一些事情。因此,除非您已經知道您打算如何處理每個字串,以及是否需要分號,否則最好首先將它們排除在match_apps之外以優化靈活性。可以肯定的是,這只是一種意見,但絕對值得考慮。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496174.html
下一篇:用于家庭自動化的正則運算式
