正则表达式从列中捕获具有多个值的变量
Regex to capture variables with multiple values from columns
我需要使用单独的工作流元素来捕获这两个值。 ("Soldto:"正下方的第3行值与"Shipto:"相同。文本在页面上按列排列,因此将其视为简单模式不起作用。请指教。
图像是真实的,因为文本是通过扫描和 OCR'ing TIF 图像生成的,但这里是我为了测试而复制的一些文本(比页面上的更简洁)
Soldto: Shipto: Billto:
00011222 00017872 10221060
COSTCO CO INC. - GLOBAL EDI COSTCO LANGLEY DEPOT COSTCO CO/LANGLEY
为了避免所有 HTML 格式化这些列所需的格式,我将示例文本链接为 .txt file.
感谢您的帮助。
好吧,您实际上并没有提出所讨论的编程语言,所以我将在 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。
好的,所以我发现了一些关于 Laserfiche 的事情。
1.它没有使用\R和\K命令,所以PHP代码不起作用。
2. 它不会将 OCR 结果保存在列中,因此通过列进行解析虽然非常酷,但不是必需的。
部分文字如下:
品牌:生产时间:10:03:09
小数:
00011222
COSTCO CO INC. - 全球 EDI
华盛顿,
Shipto:
00010377
COSTCO/TRACY#179
25862 小号舒尔特
特雷西,加利福尼亚州,95376
以下是完成这项工作的正则表达式:
一种。卖出:So[lit1I|]dto:(?:\s+\d+\s+)(.+)
b. Shipto: Sh[lit1I|]pto:(?:\s+\d+\s+)(.+)
感谢大家的帮助!
我需要使用单独的工作流元素来捕获这两个值。 ("Soldto:"正下方的第3行值与"Shipto:"相同。文本在页面上按列排列,因此将其视为简单模式不起作用。请指教。
图像是真实的,因为文本是通过扫描和 OCR'ing TIF 图像生成的,但这里是我为了测试而复制的一些文本(比页面上的更简洁)
Soldto: Shipto: Billto:
00011222 00017872 10221060
COSTCO CO INC. - GLOBAL EDI COSTCO LANGLEY DEPOT COSTCO CO/LANGLEY
为了避免所有 HTML 格式化这些列所需的格式,我将示例文本链接为 .txt file.
感谢您的帮助。
好吧,您实际上并没有提出所讨论的编程语言,所以我将在 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。
好的,所以我发现了一些关于 Laserfiche 的事情。
1.它没有使用\R和\K命令,所以PHP代码不起作用。
2. 它不会将 OCR 结果保存在列中,因此通过列进行解析虽然非常酷,但不是必需的。
部分文字如下:
品牌:生产时间:10:03:09
小数:
00011222
COSTCO CO INC. - 全球 EDI
华盛顿,
Shipto:
00010377
COSTCO/TRACY#179
25862 小号舒尔特
特雷西,加利福尼亚州,95376
以下是完成这项工作的正则表达式:
一种。卖出:So[lit1I|]dto:(?:\s+\d+\s+)(.+)
b. Shipto: Sh[lit1I|]pto:(?:\s+\d+\s+)(.+)
感谢大家的帮助!