在<之间匹配数学>符号

时间:2017-06-13 15:11:02

标签: php regex

我正在尝试构建一个与两个更大(或相等)或更小(或相等)符号之间的数学表达式匹配的函数。

我有以下preg_match函数:

preg_match("/(<=?|>=?)(([0-9]|\+|\(|\))+)(<=?|>=?)/", "2<(2+2)<8", $matches);

当我读到$ matches数组时,我得到:

Array
(
    [0] => <(2+2)<
    [1] => <
    [2] => (2+2)
    [3] => )
    [4] => <
)

任何人都可以解释为什么结束)作为(2 + 2)及其自身的一部分进行匹配?我希望它只匹配整个(2 + 2)。

2 个答案:

答案 0 :(得分:1)

因为您在比较符号之间有两个捕获组:

(<=?|>=?)(([0-9]|\+|\(|\))+)(<=?|>=?)
         ^^              ^ ^
         |`----- $3 -----' |
         `------- $2 ------'

将其更改为

(<=?|>=?)((?:[0-9]|\+|\(|\))+)(<=?|>=?)
           ^^

答案 1 :(得分:0)

因为您有一个量化的捕获组(...)+

每次通过捕获组,将捕获组重置为空 结果是你只看到最后一次捕获。

您可以在下面看到3 start/end

 ( <=? | >=? )                 # (1)
 (                             # (2 start)
      (                             # (3 start)
           [0-9] 
        |  \+
        |  \(
        |  \) 
      )+                            # (3 end)
 )                             # (2 end)
 ( <=? | >=? )                 # (4)

在这种情况下,各个部件都没用,
将其更改为群集组将从输出数组中将其排除。

 ( <=? | >=? )                 # (1)
 (                             # (2 start)
      (?:
           [0-9] 
        |  \+
        |  \(
        |  \) 
      )+
 )                             # (2 end)
 ( <=? | >=? )                 # (3)

输出

 **  Grp 0 -  ( pos 0 , len 7 ) 
<(2+2)<  
 **  Grp 1 -  ( pos 0 , len 1 ) 
<  
 **  Grp 2 -  ( pos 1 , len 5 ) 
(2+2)  
 **  Grp 3 -  ( pos 6 , len 1 ) 
<