[リストへもどる]
一括表示
タイトル正規表現で読み込み違反のエラー
記事No3695
投稿日: 2007/01/26(Fri) 19:38
投稿者Seek
はじめまして、先ほど使用している最中にエラーがあったので載せておきます。

エラーメッセージ
「モジュール 'ntdll.dll' のアドレス 7C95142E でアドレス 656C7552 に対する読み込み違反がおきました。」


正規表現を使用することにより、必ずエラーが必ず起こります。
その対象の文と正規表現は下記に書き記してます。

使用しているPCの環境は以下のものです。
OS: WindowsXP Pro SP2
CPU: Core 2 Duo E6300
Memory: 1G
Mother: 不明
Chipset: Intel G965


=============== 対象文字列 ===============
SELECT
'A' AS CCY
FROM
TABLE

UNION ALL

SELECT
'B' AS CCY
FROM
TABLE

UNION ALL

SELECT
'C' AS CCY
FROM
TABLE

UNION ALL

SELECT
'D' AS CCY
FROM
TABLE

UNION ALL

SELECT
'E' AS CCY
FROM
TABLE



^(UNION ALL\n\n[^\n]+)\n {4}([^\n]+)\n([^\n]+)\n {4}([^\n]+\n)|^([^\n]+)\n {4}([^\n]+)\n([^\n]+)\n {4}([^\n]+\n)
\1 \2 \3 \4
=========================================

======================= 検索語 =======================
^(UNION ALL\n\n[^\n]+)\n {4}([^\n]+)\n([^\n]+)\n {4}([^\n]+\n)|^([^\n]+)\n {4}([^\n]+)\n([^\n]+)\n {4}([^\n]+\n)
========================================================

===================== 置換する語 =====================
\1 \2 \3 \4
======================================================

タイトルRe: 正規表現で読み込み違反のエラー
記事No3696
投稿日: 2007/01/26(Fri) 20:31
投稿者
> エラーメッセージ
> 「モジュール 'ntdll.dll' のアドレス 7C95142E でアドレス 656C7552 に対する読み込み違反がおきました。」

私の環境でもエラーが発生することを確認しました。

ちょっと横道に外れますが。

この正規表現をちゃんと処理できない正規表現エンジンは結構あるかもしれません。

問題点1:キャレット(^)を行頭の意味で2箇所使っている。
 キャレットが正規表現の先頭にあれば行頭の意味に解釈してもらえるのは確実ですが、「|」でつないだ直後だとそのように解釈しないエンジンがありえそうです。

問題点2:グループの番号が重複する可能性がある
 今回の正規表現の場合、「|」でつないだ前後でグループの番号が重複します。これがエラーを引き起こす原因になりかねません。

 今回の場合、同じ意味の
「^((?:UNION ALL\n\n)?[^\n]+)\n {4}([^\n]+)\n([^\n]+)\n {4}([^\n]+\n)」
のように記述すると置換できます。

 ちなみに、多分転写ミスだと思いますが、置換文字列は
「\1 \2 \3 \4」
ではなく、
「$1 $2 $3 $4」
が正しいと思います。