【问题标题】:Regex to match a string after colon正则表达式匹配冒号后的字符串
【发布时间】:2010-10-12 18:22:11
【问题描述】:

输入字符串是这样的:OU=TEST:This001。我们需要额外的“This001”。最好的 C#。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    怎么样:

    /OU=.*?:(.*)/
    

    这是它的工作原理:

    OU=  // Must contain OU=
    .    // Any character
    *    // Repeated but not mandatory
    ?    // Ungreedy (lazy) (Don't try to match everything)
    :    // Match the colon
    (    // Start to capture a group
      .    // Any character
      *    // Repeated but not mandatory
    )    // End of the group
    

    对于/,它们是分隔符,用于知道正则表达式的开始位置和结束位置(以及添加选项)。

    捕获的组将包含This001

    但使用简单的Substring() 会更快。

    yourString.Substring(yourString.IndexOf(":")+1);
    

    资源:

    【讨论】:

    • 我没用过那个语法,有意思,今天要看看:)
    • 我找不到关于您的正则表达式构造的任何文档,您能否提供参考?
    • @leppie,它是 perl 语法,但它也与其他正则表达式风格一起使用。没错,在 .net 中不需要分隔符,但我仍然使用它们来拥有任何人都可以理解的“标准”正则表达式。
    • +1 让我们这些人在每次使用正则表达式时都需要重新学习。
    • +1 用于解释那里的任何字符是什么意思,人们习惯提供食谱但忘记解释。谢谢!
    【解决方案2】:

    "OU=" 闻起来就像您正在执行 Active Directory 或 LDAP 搜索并响应结果。虽然 regex 是一个出色的工具,但我只是想确保您也了解出色的 System.DirectoryServices.Protocols 类,这些类仅用于解析、过滤和操作此类数据。

    SearchResult、SearchResultEntry 和 DirectoryAttribute 尤其是您可能正在寻找的朋友。我不怀疑您可以像下一个人一样聪明地进行正则表达式或子字符串,但工具箱中还有另一个好工具也很好。

    你试过这些课程吗?

    【讨论】:

    • 这是来自证书。 "OU=" 是 System.Security.Cryptography.X509Certificates 中主题名称的一部分。
    【解决方案3】:

    没有正则表达式的解决方案:

    var str = "OU=TEST:This00:1";
    var result = str.Split(new char[] { ':' }, 2)[1];
    
    // result == This00:1
    

    Regex vs Split vs IndexOf

    拆分

    var str = "OU=TEST:This00:1";
    
    var sw = new Stopwatch();
    
    sw.Start();
    var result = str.Split(new char[] { ':' }, 2)[1];
    sw.Stop();
    
    // sw.ElapsedTicks == 15
    

    正则表达式

    var str = "OU=TEST:This00:1";
    
    var sw = new Stopwatch();
    
    sw.Start();
    var result = (new Regex(":(.*)", RegexOptions.Compiled)).Match(str).Groups[1];
    sw.Stop();
    
    // sw.ElapsedTicks == 7000 (Compiled)
    

    索引

    var str = "OU=TEST:This00:1";
    
    var sw = new Stopwatch();
    
    sw.Start();
    var result = str.Substring(str.IndexOf(":") + 1);
    sw.Stop();
    
    // sw.ElapsedTicks == 40
    

    获胜者:分裂

    链接

    【讨论】:

    • 好主意,但只有 "OU=" 和 ":" 具有固定值/长度。其他一切都是可变的。
    • @Icerman:长度无关紧要,如果它至少有一个:,它将得到它之后的所有内容。
    • str.Split(new char[] { ':' }, 2)第二个参数表示要拆分多少块。告诉分成 2 会导致 OU=jjj:kkkkkk:aaaaa:ssssss:xxxx 将返回 2 个组:OU=jjjkkkkkk:aaaaa:ssssss:xxxx
    【解决方案4】:

    如果OU=TEST: 是您要匹配的字符串之前的要求,请使用此正则表达式:

    (?<=OU\s*=\s*TEST\s*:\s*).*
    

    该正则表达式匹配冒号之后的任何长度的文本,而冒号之前的任何文本只是一个要求。

    您可以将TEST 替换为[A-Za-z]+ 以匹配除TEST 之外的任何文本,或者您可以将TEST 替换为[\w]+ 以匹配任意长度的字母和数字组合。

    \s* 表示该位置可能是任意数量的空格或什么都没有,如果您不需要这样的检查,请将其删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多