在三行字符串中找到六个连续的整数

Finding six consecutive integers in three lines of string

我在 Java 中编写了一个 OCR 程序,它可以扫描文档并找到其中的所有文本。我的主要任务是找到可以是 6 或更多整数的发票编号。

我使用了子字符串功能,但效率不高,因为该数字的位置随每个文档而变化,但它始终出现在 OCR 文本的前三行中。

我想在 Java 8 中编写代码,从那里我可以遍历前三行并获得这 6 个连续的数字。

我正在使用 Tesseract 进行 OCR。

示例:

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

从这里,我需要提取数字 278464

请帮忙!!

使用正则表达式尝试以下代码。

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) 匹配但不捕获当前和之前的文本不是数字
  • \\d{6} 正好匹配 6 个数字
  • (?!\\d) 匹配但不捕获当前文本和当前之后的文本不是数字

直接用\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

检查此代码。

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();
    }
}

}