The explanation is still for the 44 bytes solution. Gonna change it soon.
lsmf|!@<G5dq%T2}\odlsm-%R2}hKvMc-ecd\:G\-eKceK?}\ed}edGYc-rzZd\, implicit: z = input string
rzZ convert z to lower-case
- d remove all spaces from z
c \, and split by ","
m map each part d to:
cd\: cd\: split d by ":"
e e and only use the last part (removes page number)
- G - G remove all letters (removes odd/even)
c \- c \- split by "-"
vM vM and evaluate all (one or two) numbers
K K and store the result in K
}hK }hK eK eK create the list [K[0], K[0]+1, ..., K[-1]]
f %R2 filter for numbers Tapply inmodulo this2 list,to whicheach satisfy:element
@<G5d - the intersection of "abcde" and dremove:
! }\ed is empty (no odd/even"e" in d)
| or
%T2 (1 for in, 0 Tfor modnot 2in)
q ? }edG if d[-1] in "abcde...z" equalselse
}\od Y "o" indummy dvalue
s combine all the lists
l print the length