Using Finite State Machines for Pattern Matching in Java