/Windows(?=95 |98 |NT )/ 
--------------------------------------
This only returns "Windows", not include "95", "98" or "NT"/Windows(95|98|NT)
---------------------------------------
This will return "Windows95" or "Windows98" or "WindowsNT".

解决方案 »

  1.   

    For example, \w+(?=;) matches a word followed by a semicolon, but does not include the semicolon in the match,
      

  2.   

    $str="Windows95"你比较一下以下两个正则的匹配结果就明白了。
    /(Windows(?=95|98|NT)|95)/
    /(Windows(95|98|NT)|95)/
      

  3.   

    真抱歉,不知道是理解力差,还是水平,看不出来有什么区别,结果都是预想的,只是(?=)部分的内容不存储罢了。另一点,是否是?=表示被匹配过的部分不再参与下规则的匹配,也就是下次匹配从我这里为起点开始匹配?Array
    (
        [0] => Windows
        [1] => Windows
    )
    Array
    (
        [0] => Windows95
        [1] => Windows95
        [2] => 95
    )
      

  4.   

    没反,结果就是这样的。$s = "Windows95";preg_match("/(Windows(?=95|98|NT)|95)/",$s,$ar);
    print_r( $ar );preg_match("/(Windows(95|98|NT)|95)/",$s,$ar);
    print_r( $ar );
    Array
    (
        [0] => Windows
        [1] => Windows
    )
    Array
    (
        [0] => Windows95
        [1] => Windows95
        [2] => 95
    )
      

  5.   

    这个结果是没错的,是指我理解错了吗?$s = "Windows95";preg_match("/(Windows(?=95|98|NT)|95)/",$s,$ar);
    print_r( $ar );preg_match("/(Windows(95|98|NT)|95)/",$s,$ar);
    print_r( $ar );
    Array
    (
        [0] => Windows
        [1] => Windows
    )
    Array
    (
        [0] => Windows95
        [1] => Windows95
        [2] => 95
    )
      

  6.   

    是我没看清楚你用的函数。
    将preg_match改为preg_match_all才能正确比较。
      

  7.   

    /(Windows(?=95|98|NT)|95)/能得到两次匹配。分别是window,95
    /(Windows(95|98|NT)|95)/只能得到一次匹配window(95)差别在于 是否是?=表示被匹配过的部分(将会)参与下规则的匹配,也就是下次匹配从我这里为起点开始匹配。而()不会。
      

  8.   

    摘自http://www.regexlab.com/zh/regref.htm上面的话说,"正向预搜索" 是附加给 windows 后边那个 "缝隙" 的一个条件,就像 \b 和 $ 的概念一样。而 windows(95|98|NT) 实际上是执行了匹配。