Java name parse library?

前端 未结 5 758
梦如初夏
梦如初夏 2021-01-07 20:58

I\'m searching for a library similar in functionality to the Perl Lingua::EN::NameParse module. Essentially, I\'d like to parse strings like \'Mr. Bob R. Smith\' into prefix

5条回答
  •  离开以前
    2021-01-07 21:35

    This simple code can help :

    import java.util.ArrayList;
    import java.util.List;
    
    public class NamesConverter {
    
        private List titlesBefore = new ArrayList<>();
        private List titlesAfter = new ArrayList<>();
        private String firstName = "";
        private String lastName = "";
        private List middleNames = new ArrayList<>();
    
        public NamesConverter(String name) {
            String[] words = name.split(" ");
            boolean isTitleAfter = false;
            boolean isFirstName = false;
    
            int length = words.length;
            for (String word : words) {
                if (word.charAt(word.length() - 1) == '.') {
                    if (isTitleAfter) {
                        titlesAfter.add(word);
                    } else {
                        titlesBefore.add(word);
                    }
                } else {
                    isTitleAfter = true;
                    if (isFirstName == false) {
                        firstName = word;
                        isFirstName = true;
                    } else {
                        middleNames.add(word);
                    }
                }
            }
            if (middleNames.size() > 0) {
                lastName = middleNames.get(middleNames.size() - 1);
                middleNames.remove(lastName);
            }
        }
    
        public List getTitlesBefore() {
            return titlesBefore;
        }
    
        public List getTitlesAfter() {
            return titlesAfter;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public List getMiddleNames() {
            return middleNames;
        }
    
        @Override
        public String toString() {
            String text = "Titles before :" + titlesBefore.toString() + "\n"
                    + "First name :" + firstName + "\n"
                    + "Middle names :" + middleNames.toString() + "\n"
                    + "Last name :" + lastName + "\n"
                    + "Titles after :" + titlesAfter.toString() + "\n";
    
            return text;
        }
    }
    

    For example this input :

        NamesConverter ns = new NamesConverter("Mr. Dr. Tom Jones");
        NamesConverter ns1 = new NamesConverter("Ing. Tom Ridley Bridley Furthly Murthly Jones CsC.");
        System.out.println(ns);
        System.out.println(ns1);
    

    Has this output :

    Titles before :[Mr., Dr.]
    First name :Tom
    Middle names :[]
    Last name :Jones
    Titles after :[]
    
    Titles before :[Ing.]
    First name :Tom
    Middle names :[Ridley, Bridley, Furthly, Murthly]
    Last name :Jones
    Titles after :[CsC.]
    

提交回复
热议问题