用于验证和捕获 ID 和全名的 Java 正则表达式

标签 java regex

我正在开发一个程序,该程序将运行超过 20,000 条 ID、姓氏、名字、中间名记录的列表。现在,我有一个有效的正则表达式,它可以提取带有 ID 序列的记录并将它们分组,也可以提取带有违规编号序列的记录并将它们分组。两者之间的区别在于后者具有 12 个字符序列(3 个字符和 9 个数字,而不是 9 位 ID 序列)。 验证姓名存在明显的问题,有些人的姓氏是 3+,即 de la Cruz、Smith-Doe,或者只是非常长的名字。中间名也会出现同样的问题,有时只是中间名首字母后跟一个点,或者只是中间名首字母(无句点),或者是实际的中间名。

我创建了两个类来对人员对象进行建模,每个类都有 4 个字段(ID/tick num、lName、fName、mName)。我希望正则表达式能够准确地分组和存储一个人全名的 3 个部分(作为一个人对象,将存储在一个 vector 中),这样我以后就可以对同时是票务列表和 ID 列表的人进行搜索,然后将匹配项存储在单独的列表中。

我的问题是如何准确捕获有效名称。下面是我用来拉取这两个组的正则表达式(这是在 python 中完成的,但我假设我可以重用正则表达式:

'^([A-Z]{3}\d+)\s+([^\s]+([\D+])+)'  --> Ticket group
'^(\d+)\s+([^\s]+([\D+])+)'  ---> ID group

这是我的 ReadFile 类,它用于打开和读取源文件的内容,将记录存储为 people 中的对象:

public class ReadFile {
    private Scanner myScan;

    public void openFile(){
        try{
            // Scanner object will hold source list
            myScan = new Scanner(new File("C:\\source.txt"));
        }
        catch(Exception e){
            System.out.println("Could not find file.");
        }
    }

    // readFile method will iterate through and store the contents of source list into people
    public void readFile() {
        Vector<People> people = new Vector<People>();
        while(myScan.hasNext()){
            People person = new People();
            person.setSbID(myScan.next());
            person.setLastName(myScan.next());
            person.setFirstName(myScan.next());
            person.setmInit(myScan.next());
            //add the person to the people list
            people.add(person);

            System.out.printf("%s %s %s %s \n", person.getID(), person.getLastName(), person.getFirstName(), person.getmInit());
        }
    }

    public void closeFile(){
        myScan.close();
    }
}

现在,数据正在作为从扫描仪对象读取的元素传递到人员字段,但它并不是以智能方式执行的(.next())。我使用的正则表达式位于正确解析数据的Python脚本中,我只是不确定如何在Java中实现它。扫描仪的当前摘录:

people.add(person);
String text = person.toString();
String pattern = "^(\\d+)\\s+([^\\s]+([\\D+]+)";
boolean matches = Pattern.matches(pattern, text);
if (true) { System.out.println("matches = " + person); }

程序应处理的示例数据:

092331234 Smith, John M.
ABC097853827 Doe, Mark J

最佳答案

这是一个将匹配您的示例数据的正则表达式,将其分为四个部分:

^((?:[A-Z]{3})?\d{9})\s+(.+?),\s+(\S+)\s+(.+)$

查看它在 regex101 上的工作情况.

如果每一行都像你说的那么相似,我会感到惊讶。我同意 @adamdc78 的评论,即无法确定多词名字和中间名的组成部分。

我的正则表达式也做出了这些假设:

  • ID 和名称是整行
  • 总是用逗号分隔姓氏和其他名字
  • 总有一个中间名

关于用于验证和捕获 ID 和全名的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27384829/

相关文章:

java - 完成的 Java 项目,现在创建 jar 或 .exe 文件(带数据库)

java - ReplaceAll 也替换斜杠之前和之后的完整单词

arrays - 将 `ByVal` 参数传递给 Regex 函数会导致代码非常慢,尽管使用 Array

ruby-on-rails - 通过用户名查找用户或使用一个字段的电子邮件

python - 计算某些文本中多字子串的出现次数

java - 使用 EclipseLink MOXy 读取同一元素两次

java - 获取导致规则执行的所有条件

java - Java 错误

php - 识别 php 中的重复数字或数字模式

正则表达式替换 - 可选的起始 @ 字符