3

特定のテーブルをフィルター処理したい mysql 情報を含む 10 GB のファイルがいくつかあります。

クエリは次のようになります (ただし、改行は増減できます)。

SET INSERT_ID=2/\*!\*/;
at 858735202
121124 12:36:53 server id 1  end_log_pos 0  Query   thread_id=9695754   exec_time=0 error_code=0
SET TIMESTAMP=1663753413/\*!\*/;

            INSERT INTO `bank_accounts_daily`
                (
                    `accounts_bank_md5` ,
                    `accounts_bank_payment_desc` ,
                    `accounts_bank_amount` , 
                    `accounts_bank_number` ,
                    `accounts_bank_sortcode` ,
                    `accounts_bank_currency` ,
                    `accounts_bank_date`,
                    `accounts_bank_code`
                )
                VALUES
                (
                    'zxcvxzcvxzc4c9eeca78908296a2f007',
                    'NAMEJO M        1105294            BBP',
                    '278.50',
                    '645450441',
                    '20-55-19',
                    '1',
                    '26/55/2012',
                    'BBP'
                )
/\*!\*/

私はこれを使用しています。これは、すべてのステートメントを取得するために機能します。

preg_match_all('/(SET INSERT_ID=([0-9]+)\/\*\!\*\/\;)(.*?)(\/\*\!\*\/\;)(.*?)(\/\*\!\*\/)/s', $input, $output);

しかし、それを展開して、特に「bank_accounts_daily」パターンに一致するように追加のパターンを追加しようとすると、何も取得されません (バッククォートがエスケープされているかどうかに関係なく):

preg_match_all('/(SET INSERT_ID=([0-9]+)\/\*\!\*\/\;)(.*?)(\/\*\!\*\/\;)(.*?)(INSERT INTO \`bank_accounts_daily\`)(.*?)(\/\*\!\*\/)/s', $input, $output);

なぜこれが機能しないのかわかりません。ブラケットなしでバリエーションを試しましたが、何も機能していません。また、私のアプローチには、私が見ていない潜在的な問題はありますか?

4

1 に答える 1

2

この正規表現を試してください:

/(SET INSERT_ID=([0-9]+)\/\\\*\!\\\*\/\;)(.*?)(\/\\\*\!\\\*\/\;)(.*?)(INSERT INTO `bank_accounts_daily`)(.*?)(\/\\\*\!\\\*\/)/s

/\*!\*/マーカーのバックスラッシュと一致していませんでした。元の正規表現にもこの間違いがあったため、元の正規表現がどのように機能したかわかりません。

于 2013-05-07T08:36:55.453 に答える