正则表达式从列中捕获具有多个值的变量

时间:2016-02-02 18:44:43

标签: regex string text extract ocr

我需要使用单独的工作流元素捕获这两个值。 (第3行值直接在“Soldto:”下面,与“Shipto:”相同。文本在页面上按列排列,因此将其视为简单模式不起作用。请告知。

ShiptoandSoldto

图像是真实的,因为文本是通过扫描和OCR的TIF图像生成的,但这里有一些我已经复制用于测试的文本(比页面更简洁)

Soldto:                                 Shipto:                                 Billto:                                 
00011222                                00017872                                10221060                                
COSTCO CO INC. - GLOBAL EDI             COSTCO LANGLEY DEPOT                    COSTCO CO/LANGLEY        

为了避免使这些列排成一行所需的所有HTML格式,我已将示例文本链接为.txt file.

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

好吧,你实际上没有提出有问题的编程语言,所以我将在PHP中展示一个可能的解决方案:

<?php
$string = 'Soldto:                              Shipto:                                 Billto:                                 
00011222                                00017872                                10221060                                
COSTCO CO INC. - GLOBAL EDI             COSTCO LANGLEY DEPOT                    COSTCO CO/LANGLEY                       ';
$regex = '~               # delimiter
            ^Soldto:      # look for "Soldto:" at the beginning of the string
            (?:.*\R){2}   # match everything up to the end + newline (2 times)
            (?<poi>.*)    # capture the whole third row into the group "poi"
        ~x';

preg_match_all($regex, $string, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    $columns = preg_split('~\s{2,}~', $match["poi"]);
    # the idea here is to watch out for at least 2 consecutive spaces
    # and use this as delimiter

    print_r($columns);
    /* output
    Array
    (
        [0] => COSTCO CO INC. - GLOBAL EDI
        [1] => COSTCO LANGLEY DEPOT
        [2] => COSTCO CO/LANGLEY
        [3] => 
    )
    */
}
?>

这显然可以根据您的需要进行调整,但您现在可以在$columns数组中访问您的数据。

要仅从第一列(COSTCO CO INC. - GLOBAL EDI)获取字符串,您可以使用以下正则表达式:

^Soldto:(?:.*\R){2}\K((?:(?!\s{2}).)+)

查看demo here

答案 1 :(得分:0)

好的,所以我发现了一些关于Laserfiche的事情 1.它不使用\ R和\ K命令,因此PHP代码不起作用 2.它不会将OCR结果保留在列中,因此不需要通过列进行解析,而非常酷。

以下是一些文字:
品牌:生产时间:10:03:09
Sotdto:
00011222
COSTCO CO INC。 - 全球EDI
WA,
SHIPTO:
00010377
COSTCO / TRACY#179
25862 S SCHULTE
TRACY,CA,95376

以下是完成工作的正则表达式:
一个。 Soldto:So[lit1I|]dto:(?:\s+\d+\s+)(.+)
湾Shipto:Sh[lit1I|]pto:(?:\s+\d+\s+)(.+)

感谢您的帮助!