使用 regex 和 android 对不同的字段进行分类

Posted

技术标签:

【中文标题】使用 regex 和 android 对不同的字段进行分类【英文标题】:Using regex and android for categorizing different fields 【发布时间】:2016-05-10 15:56:54 【问题描述】:

我目前正在尝试做一个名片扫描仪应用程序。这里的想法是拍摄一张名片的照片,它会提取文本并将文本分类到不同的 EditText 中。

我已经完成了从名片图像中提取所有文本的 OCR 部分。

我现在缺少的是创建一个正则表达式方法,该方法可以提取从 OCR 中提取的整个文本,并将姓名、电子邮件地址、电话号码分类到 EditText 中各自的字段中。

通过一些谷歌搜索,我已经找到了下面的正则表达式:

private static final String EMAIL_PATTERN =
            "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]1,256" +
                    "\\@" +
                    "[a-zA-Z0-9][a-zA-Z0-9\\-]0,64" +
                    "(" +
                    "\\." +
                    "[a-zA-Z0-9][a-zA-Z0-9\\-]0,25" +
                    ")+";


private static final String PHONE_PATTERN =
            "^[89]\\d7$";


private static final String NAME_PATTERN =
            "/^[a-z ,.'-]+$/i";

目前我只是能够使用以下方法提取电子邮件地址:

public String EmailValidator(String email) 

        Pattern pattern = Pattern.compile(EMAIL_PATTERN);
        Matcher matcher = pattern.matcher(email);

        if (matcher.find()) 

            return email.substring(matcher.start(), matcher.end());

         else 

            // TODO handle condition when input doesn't have an email address

        

        return email;
    

我不确定如何编辑 ^above 方法^ 以包括一次使用所有 3 种正则表达式模式并将它们显示到不同的 EditText 字段,例如(姓名、电子邮件地址、电话号码)。

------------------------------------------编辑 - - - - - - - - - - - - - - - - - - - - - - - - -

使用@Styx 回答后,

它的参数有问题,我过去如何将文本“textToUse”传递给方法,如下所示:

我也尝试将文本传递给所有三个参数。但是由于方法是void,所以无法做到。或者,如果我将方法更改为 String 而不是 void,则需要返回值。

【问题讨论】:

【参考方案1】:

试试这个代码。该函数接收识别文本并使用折线符号将其拆分。然后运行一个循环并通过运行模式检查来确定内容的类型。每当确定模式时,循环将使用 continue 关键字进入下一次迭代。这段代码还能够处理一个或多个电子邮件和电话号码出现在一张名片上的情况。希望能帮助到你。干杯!

public void validator(String recognizeText) 

    Pattern emailPattern = Pattern.compile(EMAIL_PATTERN);
    Pattern phonePattern = Pattern.compile(PHONE_PATTERN);
    Pattern namePattern = Pattern.compile(NAME_PATTERN);

    String possibleEmail, possiblePhone, possibleName;
    possibleEmail = possiblePhone = possibleName = "";

    Matcher matcher;

    String[] words = recognizeText.split("\\r?\\n");

    for (String word : words) 
        //try to determine is the word an email by running a pattern check.
        matcher = emailPattern.matcher(word);
        if (matcher.find()) 
            possibleEmail = possibleEmail + word + " ";
            continue;
        

        //try to determine is the word a phone number by running a pattern check.
        matcher = phonePattern.matcher(word);
        if (matcher.find()) 
            possiblePhone = possiblePhone + word + " ";
            continue;
        

        //try to determine is the word a name by running a pattern check.
        matcher = namePattern.matcher(word);
        if (matcher.find()) 
            possibleName = possibleName + word + " ";
            continue;
        
    

    //after the loop then only set possibleEmail, possiblePhone, and possibleName into
    //their respective EditText here.


【讨论】:

我自己只是在尝试类似的东西!感谢您的回答。但是,现在出现了一个问题,因为该方法有多个参数,并且将文本传递给该方法时出错。 请检查我编辑的帖子 :) @MattDonalds 确切地说,您想达到什么目标?你打算通过匹配模式来猜测内容吗? @MattDonalds 我可以得到一个识别文本的例子吗?每个内容是否用符号隔开,例如空格“”、竖线“|”、逗号“”。 嗨,我实际上是在做一个 OCR 功能,用户可以通过该功能为名片拍照并从图像中提取文本。识别文本实际上是此 OCR 函数以字符串格式驻留的另一个活动的结果输出。一个例子是“姓名、地址、电话号码”或任何你可以在名片上找到的东西,我会说它是用空格分隔的。但是,对于地址,两者之间会有空格(但现在让我们忽略地址) @MattDonalds 当我们试图确定内容是什么时,这将是一个挑战,因为我们可能会查看这样的字符串,“Matt Donalds 60149127389 test@gmail.com。如果字符串看起来像这样那么首先需要将字符串按空格拆分为一个列表。然后对每个元素运行模式检查以确定它是电子邮件/电话。如果两个检查都失败,则将它们归类为名称。

以上是关于使用 regex 和 android 对不同的字段进行分类的主要内容,如果未能解决你的问题,请参考以下文章

Python regex - 字符串中的可选字段

regex-Notepad ++搜索并替换丢失的行

RegEx 和不同框架版本的内存使用和已知问题

我想在我的验证代码中使用regex,但不知道该把它放在哪里?

在$ group聚合中使用$ regex $ reduce,以便显示长度

如何在 SQL 函数 CHARINDEX 中使用 RegEx 查找第 n 次出现