在三行字符串中找到六个连续的整数
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();
}
}
}
我在 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();
}
}
}