Нахождение шести последовательных целых чисел в трех строках строки - PullRequest
1 голос
/ 18 марта 2020

Я написал программу OCR в Java, где она сканирует документы и находит в ней весь текст. Моя основная задача - найти номер счета, который может быть 6 или более целых.

Я использовал функцию подстроки, но это не так эффективно, поскольку позиция этого номера меняется с каждым документом, но он всегда присутствует в первых трех строках текста OCR.

Я хочу написать код в Java 8, откуда я могу перебрать первые три строки и получить эти 6 последовательных чисел.

Я использую Тессеракт для OCR.

Пример:

,——— ————i_
g DAILYW RK SHE 278464
E C 0 mp] on THE POUJER Hello, Mumbai, Co. Maha

из этого мне нужно извлечь число 278464 .

Пожалуйста, помогите !!

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Это можно решить просто с помощью \\d{6,}, как показано ниже:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String args[]) {
        // Tests
        String[] textArr1 = { ",——— ————i_", "g DAILYW RK SHE 2784647",
                "E C 0 mp] on THE POUJER Hello, Mumbai, Co. Maha" };
        String[] textArr2 = { ",——— ————i_", "g DAILYW RK SHE ——— ————",
                "E C 0 mp] on THE 278464 POUJER Hello, Mumbai, Co. Maha" };
        String[] textArr3 = { ",——— 278464————i_", "g DAILYW RK SHE POUJER",
                "E C 0 mp] on THE POUJER Hello, Mumbai, Co. Maha" };
        System.out.println(getInvoiceNumber(textArr1));
        System.out.println(getInvoiceNumber(textArr2));
        System.out.println(getInvoiceNumber(textArr3));
    }

    static String getInvoiceNumber(String[] textArr) {
        String invoiceNumber = "";
        Pattern pattern = Pattern.compile("\\d{6,}");
        for (String text : textArr) {    
            Matcher matcher = pattern.matcher(text);
            if (matcher.find()) {
                invoiceNumber = matcher.group();
            }
        }
        return invoiceNumber;
    }
}

Выход:

2784647
278464
278464
1 голос
/ 18 марта 2020

попробуйте следующий код с помощью регулярных выражений.

import java.lang.Math; // headers MUST be above the first class
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Test
{
  // arguments are passed using the text field below this editor
  public static void main(String[] args)
  {
    Pattern pattern = Pattern.compile("(?<=\\D)\\d{6}(?!\\d)");
    String str = "g DAILYW RK SHE 278464";
    Matcher matcher = pattern.matcher(str);
    if(matcher.find()){
        String s = matcher.group();
        //278464
        System.out.println(s);
    }
  }
}
  • (? <= \\ D) совпадают, но не перехватывают текущий текст, и перед текущим не указаны числа </li>
  • \\ d {6} соответствует точно 6 числам
  • (?! \\ d) соответствует, но не перехватывает текущий текст, а после текущего не являются числами
0 голосов
/ 18 марта 2020

проверьте этот код.

public class Test {

private static final Pattern p = Pattern.compile("(\\d{6,})");

public static void main(String[] args) {
    try {
        Scanner scanner = new Scanner(new File("here put your file path"));
        System.out.println("done");
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            // create matcher for pattern p and given string
            Matcher m = p.matcher(line);
            // if an occurrence if a pattern was found in a given string...
            if (m.find()) {
                System.out.println(m.group(1)); // second matched digits
            }
        }
        scanner.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...