Thread:Mathmagician/@comment-3153244-20121005032656/@comment-4674838-20121006170021

Actually, you still need one more pair of parenthesis. Remember how I did this? /* what your filter was like originally */

(A) (B)

/* what I was saying it should be like */

!("sysop" in user_groups) & ( (A)   |  (B) )

/* what you currently have */

!("sysop" in user_groups) & (A) (B)

You never want to mix AND "&" with OR "|" on the same level, because it's ambiguous. What do you suppose the following means? A & B | C If it means (A & B) | C, then the expression is true in either of two cases
 * A and B
 * C

But if it means A & (B | C), then the expression is completely different. It will be true in these two cases:
 * A and B
 * A and C

Now, technically I believe the abuse filter's parser regards OR "|" as having higher priority, so it will internally translate  . But you should never rely on this, because different systems will work differently. To resolve ambiguity, always group your expressions together with parenthesis: /* bad because it's ambiguous */

A | B & C & D | E

/* good, clear logic */

(A | B) & C & (D | E)

/* good, also clear logic, though different meaning */

A | (B & C & D) | E