【问题标题】:string.IndexOf ignoring escape sequences [closed]string.IndexOf 忽略转义序列
【发布时间】:2021-05-12 09:50:44
【问题描述】:

我正在尝试提取 LDAP DN 字符串的 CN。

这是一个说明问题的示例字符串

var dn = @"CN=Firstname Lastname\, Organization,OU=some ou,DC=company,DC=com";

我想要的是第一个非转义 ',' 字符的位置,它在位置 32。

var pos = dn.IndexOf(',');

返回第一个逗号,不管是否转义。现在我可以带IndexOf 跳过字符串中的转义逗号吗?

【问题讨论】:

  • '@' 使反斜杠看起来像一个常规字符,而不是转义序列。删除“@”。
  • 字符串"\," 不是escape sequence,它只是一个反斜杠,后跟一个逗号,例如在控制台或任何文本框中按原样打印出来。
  • 另外,这种事情最好使用正则表达式
  • @ 表示将字符串中的所有内容视为literal。因此,您的字符串中没有 "转义序列"

标签: c# string indexof


【解决方案1】:

假设\ 应该被本身转义:\\ 只放\ 你可以实现一个简单的 有限状态机

private static int IndexOfUnescaped(string source, 
                                    char toFind, 
                                    char escapement = '\\') {
  if (string.IsNullOrEmpty(source))
    return -1;

  for (int i = 0; i < source.Length; ++i) 
    if (source[i] == escapement)
      i += 1; // <- skip the next (escaped) character
    else if (source[i] == toFind)
      return i;

  return -1;
}

...

var dn = @"CN=Firstname Lastname\, Organization,OU=some ou,DC=company,DC=com";

var pos = IndexOfUnescaped(dn, ',');

【讨论】:

    【解决方案2】:

    您可以使用正则表达式:

    string s = @"CN=Firstname Lastname\, Organization,OU=some ou,DC=company,DC=com";
    Regex regex = new Regex("(?<!\\\\),", RegexOptions.Compiled);
    int firstMatch = regex.Matches(s).FirstOrDefault()?.Index ?? -1;
    

    演示:https://regex101.com/r/Jxco8K/1

    它使用了否定的lookbehind,所以检查所有逗号并查看它是否前面没有反斜杠。

    【讨论】:

      【解决方案3】:

      我的同事制作了这个正则表达式。不完全是问题,但由于我希望该职位然后使用SubString 它也可以解决问题。

      var CnRegex = new Regex(@"([a-zA-Z_]*)=((?:[^\\,}]|\\.)*)");
      var match = CnRegex.Match(input);
      if (match.Success)
          return match.Value;
      return null;
      

      我担心这会归结为正则表达式,如 Tim 的解决方案,或“蛮力”,如 Dmitry 的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 2011-07-11
        • 1970-01-01
        • 2021-03-02
        • 2018-02-24
        相关资源
        最近更新 更多