2017-09-07 23 views
1

在我的OCR文字我得到这样的输出...查找字符串基于特定的格式(7位则1个大写字母)

"responses": [ 
{ 
    "textAnnotations": [ 
    { 
     "locale": "fr", 
     "description": "3160 6392682B\nrinlraction\nE叠\narlairs&Lei sot les infractions provinsiales, Cour de jnstice de Ontarie Regt. 

我想取“6392682B”值(8字母数字字符)。数字和最后一个字符在不同的图像中会有所不同。唯一的标准部分是它的长度是8个字符(前7个将是数字,最后一个将是一个字母)。

我试着用:

preg_match_all("/(\d{7})/", $str, $ar); 

前7个数值和最后一个字母。

+4

问题是什么? –

+0

每当此值“6392682B”发生变化时。现在它的6392682B下一次会是“1112682B”,所以发现难以取值 – Subramanian

+2

它仍然不清楚你想要问我们什么 –

回答

1
$description = "3160 6392682B\nrinlraction\nE叠\narlairs&Lei sot les infractions provinsiales, Cour de jnstice de Ontarie Regt."; 

地匹配7位则1个大写字母字符:(Demo

echo preg_match('/\d{7}[A-Z]/',$description,$out)?$out[0]:'not found'; 

如果你知道你的子紧跟数字的第一串和一个空格:

echo preg_match('/\d+ \K\d{7}[A-Z]/',$description,$out)?$out[0]:'not found'; 

如果您需要设置一些边界,以便在子网上没有前导字符或结尾字符环:

echo preg_match('/\b\d{7}[A-Z]\b/',$description,$out)?$out[0]:'not found'; 

这将检查的数字的序列不是8个或更多,并且没有一个字母数字字符或下划线以下您想要的子串的大写字母。

如果你知道你的子串的位置,你甚至可以与之匹敌基于该preceed &跟踪它的特点:

echo preg_match('/ \K[^\n]+/',$description,$out)?$out[0]:'not found'; 

一些补充说明:

\K表示从哪里开始的fullstring匹配,所以不需要捕获组。

\b是一个正则表达式元字符称为 “word boundary”。

在字符串的开始处使用锚点^仅在您知道您所需的子字符串遵循数字字符串和空格时才有用。

unicode标志是不必要的,因为你的PATTERN没有使用任何unicode字符。

你可以在regex101.com测试我的模式选择只能在充分了解您的输入字符串($description)的变化来确定最准确,最有效的方式。我不会对字符串中的子串位置做任何假设。

我可以绝对确定的唯一事情就是基于您提供的详细信息的匹配模式:7位数然后是1个大写字母。这正是我的第一种,第二种和第三种模式所做的。

弗朗西斯的第一图案将匹配:AAAAAAAAAAAAAAAAA111111111111111111111A2S3D4F5G6H7J8K9L0 弗朗西斯的第二模式将匹配:​​3210,99999999A1B2C3D4

这使得他的模式不准确/坏/误导性,并有可能教未来,让读者差的正则表达式实践...更不用说潜在地污染你的项目了!

相关问题