2016-02-02 30 views
4

我目前正在嘗試做一個商業名片掃描儀應用程序。這裏的想法是拍攝一張名片的圖片,它將提取文本並將文本分類到不同的EditText中。使用正則表達式和android分類不同的字段

我已經完成了OCR一部分中提取出所有從名片圖像的文字。

什麼我現在缺少的是使這可以從OCR提取這整個文本分類的姓名,電子郵件地址,電話號碼,在EditText上各自的領域正則表達式的方法。

通過一些谷歌上搜索我已經找到了下面的正則表達式的公式:

private static final String EMAIL_PATTERN = 
      "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + 
        "\\@" + 
        "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + 
        "(" + 
        "\\." + 
        "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + 
        ")+"; 


private static final String PHONE_PATTERN = 
      "^[89]\\d{7}$"; 


private static final String NAME_PATTERN = 
      "/^[a-z ,.'-]+$/i"; 

目前我只是能夠提取出使用下面的方法的電子郵件地址:

public String EmailValidator(String email) { 

     Pattern pattern = Pattern.compile(EMAIL_PATTERN); 
     Matcher matcher = pattern.matcher(email); 

     if (matcher.find()) { 

      return email.substring(matcher.start(), matcher.end()); 

     } else { 

      // TODO handle condition when input doesn't have an email address 

     } 

     return email; 
    } 

我不確定如何編輯^上述方法^使用所有3種正則表達式模式在一次包括並將其展示給喜歡不同的EditText字段(姓名,電子郵件地址,電話麻木ER)。

--------------------------------------------編輯-------------------------------------------------

使用@Styx答案後,

它具有與我由此如何用來傳遞文本「textToUse」給該方法的參數的一個問題,如下所示:

enter image description here

我有也嘗試將文本傳遞給所有三個參數。但由於方法是void,因此無法完成。或者,如果我將方法更改爲String而不是void,則需要返回值。

enter image description here

回答

4

試試這個代碼。該功能採用識別文本並使用折線符號進行分割。然後運行循環並通過運行模式檢查來確定內容的類型。每當一個模式被確定,然後循環將進入下一次迭代使用繼續關鍵字。這段代碼還能夠處理一張或多張電子郵件和電話號碼出現在單張名片上的情況。希望能幫助到你。乾杯!

public void validator(String recognizeText) { 

    Pattern emailPattern = Pattern.compile(EMAIL_PATTERN); 
    Pattern phonePattern = Pattern.compile(PHONE_PATTERN); 
    Pattern namePattern = Pattern.compile(NAME_PATTERN); 

    String possibleEmail, possiblePhone, possibleName; 
    possibleEmail = possiblePhone = possibleName = ""; 

    Matcher matcher; 

    String[] words = recognizeText.split("\\r?\\n"); 

    for (String word : words) { 
     //try to determine is the word an email by running a pattern check. 
     matcher = emailPattern.matcher(word); 
     if (matcher.find()) { 
      possibleEmail = possibleEmail + word + " "; 
      continue; 
     } 

     //try to determine is the word a phone number by running a pattern check. 
     matcher = phonePattern.matcher(word); 
     if (matcher.find()) { 
      possiblePhone = possiblePhone + word + " "; 
      continue; 
     } 

     //try to determine is the word a name by running a pattern check. 
     matcher = namePattern.matcher(word); 
     if (matcher.find()) { 
      possibleName = possibleName + word + " "; 
      continue; 
     } 
    } 

    //after the loop then only set possibleEmail, possiblePhone, and possibleName into 
    //their respective EditText here. 

} 
+0

我只是想自己相似的東西!感謝您的回答。但是,現在存在一個問題,因爲該方法有幾個參數,並且將文本傳遞給方法時出錯。 **請檢查我編輯過的帖子** :) –

+0

@MattDonalds你想達到什麼目的?你打算通過做匹配模式來猜測內容嗎? – kopikaokao

+0

@MattDonalds我可以得到一個識別文本看起來像什麼的例子嗎?每個內容是否由符號分隔,例如空格「」,管道「|」,逗號「,」。 – kopikaokao

相關問題