我正在开发一个程序,该程序将运行超过 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/