SkRegExp 2.0 変更の詳細「再帰グループ」

SkRegExp verion 2.0 は仕様が変更になっています。

今回は「再帰グループ」の変更の詳細について説明します。

「再帰グループ」の仕様変更は次の通りです。

1.5 までは TRegEx(PCRE) と同様、再帰グループの中にバックトラックしませんでした。
2.0 からは Perl と同様、再帰グループの中にバックトラックします。

正規表現パターン ^(.|(.)(?1)2)$ を例に説明します。

これは右から読んでも左から読んでも同じ文字列にマッチする正規表現です。

SkRegExp version 2.0.0 では abcba に対して次のようにマッチが進みます。

  1. |の右側をバックトラックスタックを退避(イ)
  2. 1文字目の a にマッチ
  3. 次の文字が行末ではない
  4. 1文字目までバックトラックして次の選択(イ)へ
  5. 1文字目の a にマッチ
  6. 再帰呼び出し1
  7. |の右側をバックトラックスタックを退避(ロ)
  8. 2文字目の b にマッチ
  9. グループ2に b をセット
  10. 3文字目はグループ2を後方参照するが b ではない
  11. 1文字目までバックトラックして次の選択(ロ)へ
  12. 1文字目の a にマッチ
  13. 2文字目の b にマッチ
  14. グループ2に b をセット
  15. 再帰呼び出し2
  16. |の右側をバックトラックスタックを退避(ニ)
  17. 3文字目の c にマッチ
  18. 再帰1へ戻る
  19. 4文字目は グループ2を後方参照し b とマッチ
  20. 再帰を抜ける
  21. 4文字目は グループ2を後方参照し a とマッチ
  22. 行末なのでマッチ成功
このパターンには|が使われているのでバックトラックが起こります。
再帰グループの中にバックトラックしない TRegEx (PCRE) では、aba にはマッチしても、abcba にはマッチしません。

どちらの仕様が良いかは好みだと思います。

ただ、個人的には、再帰グループの中にバックトラックする仕様の方が直観的だと思います。

SkRegExp version 2.0 はコチラからダウンロードできます。

コメントを残す

メールアドレスが公開されることはありません。