如何让string.IndexOf跳过转义字符 提取LDAP DN字符串的CN值
针对LDAP DN提取未转义逗号位置的实现方案
方案1:手动遍历实现(性能最优,适合高频调用场景)
核心逻辑是遍历过程中跟踪转义状态:遇到反斜杠就翻转转义标记,遇到逗号时如果转义标记为false,就是要找的第一个未转义逗号。
实现代码如下:
public static int FindFirstUnescapedComma(string inputDn) { bool escapeFlag = false; for (int i = 0; i < inputDn.Length; i++) { if (inputDn[i] == '\\') { escapeFlag = !escapeFlag; continue; } if (inputDn[i] == ',' && !escapeFlag) { return i; } escapeFlag = false; } // 未找到符合要求的逗号时返回-1 return -1; }
调用示例:
var dn = @"CN=Firstname Lastname\, Organization,OU=some ou,DC=company,DC=com"; var pos = FindFirstUnescapedComma(dn); // 示例中pos返回值为32,符合预期
方案2:正则实现(代码更简洁,适合低频调用场景)
可以直接用正则匹配符合规则的未转义逗号,正则规则为(?<!\\)(?:\\\\)*,,匹配逻辑是:逗号前面要么没有反斜杠,要么有偶数个反斜杠(即反斜杠自身已经被转义抵消)。
实现代码如下:
using System.Text.RegularExpressions; var dn = @"CN=Firstname Lastname\, Organization,OU=some ou,DC=company,DC=com"; var matchResult = Regex.Match(dn, @"(?<!\\)(?:\\\\)*,"); if (matchResult.Success) { int pos = matchResult.Index; }
如果最终目的是提取CN字段的值,可以直接用正则一步完成提取,还支持自动移除转义符:
var cnMatch = Regex.Match(dn, @"^CN=((?:\\.|[^,])*)"); if (cnMatch.Success) { // 原始带转义的CN值 string rawCn = cnMatch.Groups[1].Value; // 移除转义符后的CN值 string cleanedCn = Regex.Replace(rawCn, @"\\(.)", "$1"); // 示例中cleanedCn结果为 "Firstname Lastname, Organization" }
内容的提问来源于stack exchange,提问作者Stephan Steiner
相关产品推荐
相关产品推荐

