2

改行を含む文字列から配送情報のデータを取得しようとしています。配送情報は、おそらく 3 ~ 5 行です。いくつかの例を次に示します。

    /* Just need from here */
Ship NEXT DAY PM to:
John Doe
Address Street
Sweet, NC 55555
    /* to here */
Email: john@doe.net
Phone: 555-555-555

Ship NEXT DAY AM to:
John Doe
Address Street
Apt. 555
Sweet, NC 55555

Email: john@doe.net
Phone: 555-555-555

Ship NEXT DAY PM to:
John Doe
c/o Jane Doe
Address Street
Apt. 555
Sweet, NC 55555

Email: john@doe.net
Phone: 555-555-555

アップデート

私はついに正規表現の解決策を見つけました。また、うまく機能していると思われるコメントが 1 つ挙げられました。「理由」に基づいてどちらが優れているかはわかりませんが、次のとおりです。

Ship (.)+ to\:((\n)(.)+){1,5}

Ship (.)+ to\:[\s\S]*?(?=\nEmail)

今、私はまったく新しい問題を抱えています。結局のところ、MySQL REGEXP は期待どおりに機能しません (API をスキムするのではなく、わざわざ読んでいればわかっていたことでしょう)。だから今、私は部分文字列から正規表現したものを引き出そうとしています IF それが存在する. 取得した IF 部分は、REGEX を使用して Ship To が見つかったかどうかを確認し、NULL でない場合は部分文字列の抽出を開始するだけです。LOCATE部分文字列抽出は、複数の組み合わせで使用して正確な文字位置を取得しようとするのがかなり面倒であることがわかっているため、私が立ち往生している場所です。早くて簡単な方法を知っている人はいますか?エラーが発生しなくなり次第、作業中のものを投稿します(笑)。

これまでのところ、If ステートメントに次の作業を行っています。

MID(`Notes`, (LOCATE(' to:\n', `Notes`) + 5), (LOCATE('\n\nEmail:', `Notes`) - LOCATE(' to:\n', `Notes`) - 5)) as ShipAddress
4

2 に答える 2

1

次のパターンが機能するはずです

Ship (.)+ to\:[\s\S]*?(?=\nEmail)

ここでは、それが何をするかを説明します。

MySQL の部分については、ここでも参照されているlib_mysqludf_preg UDF を使用できます: https://stackoverflow.com/a/2742764/674700

于 2013-11-04T16:07:33.690 に答える
0

私の最終的な解決策:

余分なライブラリの提案はおそらく良い方法でしたが、私はむしろ利用可能なものを使いたいと思います. CASE最後に、次のように正規表現と簡単なステートメントを使用しました。

CASE
    WHEN `Notes` REGEXP 'Ship (.)* to\:((\n)(.)+){1,5}'
    THEN MID(`Notes`, (LOCATE(' to:\n', `Notes`) + 5), (LOCATE('\n\nEmail:', `Notes`) - LOCATE(' to:\n', `Notes`) - 5))
END as 'ShipAddress',

もちろん、これには、解析される各ノートの正確なレイアウトを知る必要があります。幸いなことに、私はそのコードを書いており、毎回 DB に保存される正確なレイアウトを知っています。:)

于 2013-11-05T14:18:10.560 に答える