android studioでOCRを使ってレシートの文字列を取得するプログラムを作っています。
レシートの中の商品名、金額、日付だけが必要なので、正規表現でそこのみを抽出したいです。
日付と金額はとりあえず抽出できましたが、商品名がうまくいきません。
処理をしている部分のコードがこれです。
java
1 private static String convertResponseToString(BatchAnnotateImagesResponse response) { 2 StringBuilder message = new StringBuilder("I found these things:\n\n"); 3 4 TextAnnotation label = response.getResponses().get(0).getFullTextAnnotation(); 5 String str = null; 6 str = label.getText(); 7 8 String matchdate = null; 9 String regaxdate = null; 10 String regaxprice = null; 11 ArrayList<String> priceList = new ArrayList<>(); 12 ArrayList<String> goodsList = new ArrayList<>(); 13 14 //日付取得の処理 15 regaxdate = "\d{4}-\d{1,2}-\d{1,2}|\d{4}/\d{1,2}/\d{1,2}|\d{4}年\d{1,2}月\d{1,2}日"; 16 Pattern pdate = Pattern.compile(regaxdate); 17 Matcher mdate = pdate.matcher(str); 18 if (mdate.find()) { 19 matchdate = mdate.group(); 20 } 21 22 //値段取得の処理 23 regaxprice = "¥([,0-9]+)"; 24 Pattern pprice = Pattern.compile(regaxprice); 25 Matcher mprice = pprice.matcher(str); 26 while(mprice.find()) { 27 priceList.add(mprice.group()); 28 } 29 30 //品名取得の処理 31 String regaxkei = ".*小計.*"; 32 Pattern pkei = Pattern.compile(regaxkei); 33 Matcher mkeinohou = pkei.matcher(str); //計マッチ 34 35 36// try { 37 String matchdatehinmei = mdate.group(); 38 int firstidx = str.indexOf(matchdatehinmei) + matchdatehinmei.length(); 39 String matchkeihinmei = mkeinohou.group(); 40 int lastidx = str.indexOf(matchkeihinmei); 41 42 String datekarakei = str.substring(firstidx, lastidx); 43 datekarakei.replace("[0-9]", ""); 44 datekarakei.replace("\", ""); 45 message.append(datekarakei); 46// } catch(IllegalStateException e ) { 47// message.append("画像認識に失敗しました。" + "n" + e+ "\n"); 48// message.append("商品1" + "\n"); 49// message.append("商品2" + "\n"); 50// message.append("商品3" + "\n"); 51// message.append("商品4" + "\n"); 52// message.append("商品5" + "\n"); 53// 54// } 55 56 if (str != null) { 57// message.append("" + 58// "文字認識できてます。" + "\n"); 59 if(matchdate != null) { 60 message.append(matchdate + "\n"); 61 } else { 62 message.append("日付マッチしませんでした。" + "\n"); 63 } 64 if(priceList!= null) { 65 for (int i = 0; i < priceList.size() - 1; i++) { 66 message.append(priceList.get(i) + "\n"); 67 } 68 } else { 69 message.append("価格マッチしませんでした。" + "\n"); 70 } 71 } else { 72 message.append("認識されませんでした。" + "\n"); 73 } 74 return message.toString(); 75 76 } 77}
エラーが以下です。
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) at java.util.concurrent.FutureTask.setException(FutureTask.java:252) at java.util.concurrent.FutureTask.run(FutureTask.java:271) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.IllegalStateException: No successful match so far at java.util.regex.Matcher.ensureMatch(Matcher.java:1101) at java.util.regex.Matcher.group(Matcher.java:369) at java.util.regex.Matcher.group(Matcher.java:330) at com.google.sample.cloudvision.MainActivity.convertResponseToString(MainActivity.java:375) at com.google.sample.cloudvision.MainActivity.access$100(MainActivity.java:77) at com.google.sample.cloudvision.MainActivity$LableDetectionTask.doInBackground(MainActivity.java:283) at com.google.sample.cloudvision.MainActivity$LableDetectionTask.doInBackground(MainActivity.java:269) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764)
String matchkeihinmei = mkeinohou.group();
でCaused by: java.lang.IllegalStateException: No successful match so far
というエラーが出てるみたいなのですが、どう直せばいいかわかりません。
ご教授願います。
商品名を抽出する上で試してるのは、正規表現で日付と”計”の間の文字列を抽出、数字と”¥”を削除
それで商品名だけ抽出しようとしています。
回答1件
あなたの回答
tips
プレビュー