質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1316閲覧

正規表現がうまくいかない

telin

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/12/13 04:40

編集2018/12/13 05:22

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
というエラーが出てるみたいなのですが、どう直せばいいかわかりません。
ご教授願います。

正規表現を使わずただ文字列をとってくるだけだとこのようになります
商品名を抽出する上で試してるのは、正規表現で日付と”計”の間の文字列を抽出、数字と”¥”を削除
それで商品名だけ抽出しようとしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/13 05:05

OCR詳しくないので教えていただきたいのですがどういう値が入ってくるのでしょうか? サンプルデータも提示されると回答も得やすくなります
guest

回答1

0

ベストアンサー

まだマッチしてないだけでは?
(mkeinohou は find() も matches() の呼んでいない)

投稿2018/12/13 05:22

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

telin

2018/12/13 06:11

if文でfind使ったらうまくいきました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問