\b(\s+)://(\s+)(?::(\s+))?\b“?:”有什么用?

解决方案 »

  1.   

    代码/语法 说明
    * 重复零次或更多次
    + 重复一次或更多次
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到m次
      

  2.   

    捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
    (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
    (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
    零宽断言 (?=exp) 匹配exp前面的位置
    (?<=exp) 匹配exp后面的位置
    (?!exp) 匹配后面跟的不是exp的位置
    (?<!exp) 匹配前面不是exp的位置
    注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
      

  3.   

    (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号 (?::(\s+))匹配:开始后面紧跟一个或多个空格如":  "但是不不捕获匹配的":  "   
      

  4.   

    ?: 表示匹配,但是不获取内容,供下面的匹配。
    举个例子:
    字符串:testa
    正则为:.*?(?=test)testa.*?(?=test)表示查找第一个test,匹配到了test,但是并没有获取test(如果获取了,就只留下a了),留给下面的继续匹配,所以testa才能匹配成功
      

  5.   

    还是没明白,能不能不用书上的语言,换个白话文的解释(?:pattern)
     匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“或”字符 (|) 组合模式部件的情况很有用。例如,与“industry|industries”相比,“industr(?:y| ies)”是一个更加经济的表达式。 什么叫——匹配但不捕获?
      

  6.   


    是不是搞错了啊(?=test)是匹配test前面的,但是不包含test的,感觉前面加个.*?没意义啊,前面已经都匹配了后面在断言感觉没意义啊,个人看法
      

  7.   


    正如你所说,test如果获取了,怎么就会只留下a了呢? 既然是为了匹配testa,那就直接.*?testa就行了,为什么还要加一个(?=test)呢?
      

  8.   

    jiangshun兄我是这样理解的,估计我的表述有问题,让你误解了,还是按照我上面的例子来说,匹配但不捕获,指的是?:test,捕获到test(我给出的例子test之前没有任何字符串,所以就直接说成test了),遇到test,那么不捕获test,留给下面继续处理。字符串修改为:字符串:bctesta ,
    那么匹配过程是这样的,逐次匹配,当捕获bctest的时候,遇到test这个字符了,那么不捕获test,只提取bc,剩下的还没有匹配的字符串则为:testa,继续执行正则。
      

  9.   

    匹配不捕获
    所谓的捕获 是可以用Match.Groups取到的 没捕获一个就会在内存中开一片地方存上
    而不捕获的 是可以用Match.Groups取不到的 他并没有单独的保存到内存上
      

  10.   

    挺热闹,我的理解前面有两种表达式:
    1、(?:Expression)进行子表达式Expression的匹配,并将匹配内容保存到最终的整个表达式的区配结果中,但Expression匹配的内容不单独保存到一个组内
    2、(?=Expression)顺序肯定环视,表示所在位置右侧能够匹配Expression,实际的匹配结果仅仅是一个缝隙
    过客:http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Flxcnn
      

  11.   

    捕获组() 将匹配的内容捕获到组中
    非捕获组(?:) 将匹配的内容不捕获到组中
    零度断言(?=)(?!)(?<=)(?!=) 不消耗字符string input = "no something is nothing";
    string pattern1 = "[a-z]+thing";
    MatchCollection mc = Regex.Matches(input, pattern1);
    foreach(Match m in mc)
    {
        Console.WriteLine(m.Value);
    }
    /*
    something
    nothing
    */
    这里虽然thing也包含在结果中,但这里是匹配,不是捕获
    string input = "no something is nothing";
    string pattern2 = "[a-z]+(thing)";
    MatchCollection mc = Regex.Matches(input, pattern2);
    foreach(Match m in mc)
    {
        Console.WriteLine(m.Value);
        Console.WriteLine(m.Groups[1].Value);
    }
    /*
    something
    thing
    nothing
    thing
    */
    这里虽然thing包含在结果中,但这里是捕获,因为在捕获组中。
    string input = "no something is nothing";
    string pattern3 = "[a-z]+(?:thing)";
    MatchCollection mc = Regex.Matches(input, pattern3);
    foreach(Match m in mc)
    {
        Console.WriteLine(m.Value);//m.value和其他的是一样的
        Console.WriteLine(m.Groups[1].Value);//这里会出错, 因为没有捕获组
    }string input = "no something is nothing";
    string pattern2 = "[a-z]+(?=thing)";
    MatchCollection mc = Regex.Matches(input, pattern2);
    foreach(Match m in mc)
    {
        Console.WriteLine(m.Value);
    }
    /*
    some
    no
    */
    这里虽然thing不包含在结果中,这里不是捕获,是零度断言。
      

  12.   


    理解1:也就是说()是针对Matches而言的,在()中的取走另存为一个对象,不在()中的不另存。
    理解2:断言就好比“非运算”,取()中匹配的“反”。
    理解3:“?:”只是校验是否匹配,好比“if”控制语句,如果匹配继续校验直到被捕获,如果不匹配,就直接跳过或返回false。
    以上3种理解,对么?
      

  13.   


    string input = "no something is nothing";
    string pattern1 = "[a-z]+thing";
    MatchCollection mc = Regex.Matches(input, pattern1);
    foreach(Match m in mc)
    {
        Console.WriteLine(m.Value);
    }
      

  14.   

    http://hi.csdn.net/link.php?url=http://blog.csdn.net%2Flxcnn