質問: stBuff; ```
回答: 原因そのものは正規表現のバックトラッキングが指数関数的な回数で発生しているため、実行に長時間を要し、フリーズしたように観測されます。 例として ``` item0item1 ``` 上記HTMLコード片でなぜ多数のバックトラッキングが発生するかを説明すると * `<(?.*?)>` = ``、`[^<>]*?` = 、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = 、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `i`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `it`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `ite`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `item`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `item0`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = `item0`、`[^<>]*?` = 、 `\k>` ≠ `item0` → 失敗 * `<(?.*?)>` = `item0`、`[^<>]*?` = 、 `\k>` ≠ `item0` → 失敗 * `<(?.*?)>` = `item0`、`[^<>]*?` = `i`、 `\k>` ≠ `item0` → 失敗 * `<(?.*?)>` = `item0`、`[^<>]*?` = `it`、 `\k>` ≠ `item0` → 失敗 * `<(?.*?)>` = `item0`、`[^<>]*?` = `ite`、 `\k>` ≠ `item0` → 失敗 * `<(?.*?)>` = `item0`、`[^<>]*?` = `item`、 `\k>` ≠ `item0` → 失敗 * `<(?.*?)>` = `item0`、`[^<>]*?` = `item1`、 `\k>` ≠ `item0` → 失敗 * `<(?.*?)>` = `item0item1`、`[^<>]*?` = 、 `\k>` ≠ `item0item1` → 失敗 * `<(?.*?)>` = `item0item1`、`[^<>]*?` = 、 `\k>` ≠ `item0item1` → 失敗 * 文字列終端まですべて失敗したため、開始位置をずらす * `<(?.*?)>` = ``、`[^<>]*?` = 、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `i`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `it`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `ite`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `item`、 `\k>` ≠ `` → 失敗 * `<(?.*?)>` = ``、`[^<>]*?` = `item0`、 `\k>` = `` → 成功 といった探索が行われます。 簡単な回答としては `<(?.*?)>` が`<>`文字を認めないよう `<(?[^<>]*?)>` とすることである程度の速度改善は見られますが、本質的には解決していません。それは * ``とあった場合は``を探す * ``や``とあった場合は``や``を探す * `~`とあった場合は``を探す といった、HTMLとしては正しい記述に対してどのように対応するかの方針が必要です。これらの方針が定まらないことには置換されないタグが残り続け、上記のようなバックトラッキングを多数発生させます。 ここからは質問の範囲から外れますが、仮に理想的に解決する正規表現が実現できたとして ``` item0item1 ``` とあった場合、 ``` // 1周目 『0』item1 // 2周目 『0』『1』 // 3周目 『2』 ``` という結果になります。そもそもの問題として、これが期待するでしょうか? 期待しない結果だとすると質問そのものが無意味になるように思います。