Does anyone know of a really good explanation of the pumping lemma for regular languages? I understand all the parts, I think, but I'm having trouble getting quite how they all fit together, and how they apply in practice to some types of regular language. Ideally, I'd love to see examples that are worked out step by step, on languages a bit more real-world than the traditional "a*b*" type.