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

更新

我终于找到了正则表达式的解决方案。在评论中也提到了一个似乎运作良好的评论。不确定基于任何“为什么”哪个会更好,但它们是:

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

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

现在我有一个全新的问题。事实证明,MySQL REGEXP 没有像我预期的那样运行(如果我费心阅读而不是浏览 API,我会知道的)。所以现在我试图从一个子字符串中提取我刚刚正则表达式的内容,如果它存在的话。我得到的 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',

当然,这需要知道被解析的每个音符的确切布局。幸运的是,我编写了该代码,并且我确实知道每次都保存到数据库的确切布局。:)

于 2013-11-05T14:18:10.560 回答