You need to enable JavaScript to run this app. 如何让string.IndexOf跳过转义字符 提取LDAP DN字符串的CN值
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 15:24:03