Data.String: bugfix infinite loop in scan()

bugfix infinite loop in scan() when matched string is empty.
And improve performance.

パフォーマンス向上のためにsubstitute()使うようにしました。
ついでに無限ループバグも修正されます。
substituteの第3引数がちょっとあれな気はしますが、他に思い浮かびませんでした。
なにかご意見あればコメントいただけると助かります。