簡體   English   中英

正則表達式查找“​​姓氏,名字中間名”格式

[英]Regular Expression to find "lastname, firstname middlename" format

我試圖找到格式“abc,def g”,這是一種名稱格式“姓氏,名字中間名”。 我認為最適合的方法是正則表達式,但我對正則表達式一無所知。 我嘗試在正則表達式中進行一些學習並嘗試了一些表達,但沒有運氣。 另外一點,單詞之間可能有不止一個空格。

這是我嘗試過的。 但這不起作用。

(([A-Z][,]\s?)*([A-Z][a-z]+\s?)+([A-Z]\s?[a-z]*)*)

需要幫忙 ! 知道如何做到這一點,以便只有上面的表達式匹配。

謝謝 !

回答

最后我正在使用

([A-Za-z]+),\\s*([A-Za-z]+)\\s*([A-Za-z]+)

感謝大家的建議。

我會盡量避免使用復雜的正則表達式,我會使用String.substring()indexOf() 也就是說,像

String name = "Last, First Middle";
int comma = name.indexOf(',');
int lastSpace = name.lastIndexOf(' ');
String lastName = name.substring(0, comma);
String firstName = name.substring(comma + 2, lastSpace);
String middleName = name.substring(lastSpace + 1);
System.out.printf("first='%s' middle='%s' last='%s'%n", firstName,
            middleName, lastName);

輸出是

first='First' middle='Middle' last='Last'

您的示例輸入是"lastname, firstname middlename" - 這樣,您可以使用以下正則表達式來提取姓氏、名字和中間名(此外,可能有多個空格,並且可能同時存在大寫和非大寫字符串中的字母 - 此外,所有部分都是強制性的):

String input = "Lastname,   firstname   middlename";
String regexp = "([A-Za-z]+),\\s+([A-Za-z]+)\\s+([A-Za-z]+)";

Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(input);
matcher.find();
System.out.println("Lastname  : " + matcher.group(1));
System.out.println("Firstname : " + matcher.group(2));
System.out.println("Middlename: " + matcher.group(3));

簡短的摘要:

([A-Za-z]+)   First capture group - matches one or more letters to extract the last name
,\\s+         Capture group is followed by a comma and one or more spaces
([A-Za-z]+)   Second capture group - matches one or more letters to extract the first name
\\s+          Capture group is followed by one or more spaces
([A-Za-z]+)   Third capture group - matches one or more letters to extract the middle name

這僅在您的姓名僅包含拉丁字母時才有效 - 可能您應該對字符使用更開放的匹配:

String input = "Müller,   firstname  middlename";
String regexp = "(.+),\\s+(.+)\\s+(.+)";

這匹配姓氏、名字和中間名的任何字符。

如果空格是可選的(只有第一次出現可以是可選的,否則我們無法區分名字和中間名),那么使用*代替+

String input = "Müller,firstname  middlename";
String regexp = "(.+),\\s*(.+)\\s+(.+)";

正如@Elliott 所提到的,可能還有其他可能性,例如將String.split()String.indexOf()String.substring()一起使用 - 正則表達式通常更靈活,但更難維護,尤其是對於復雜的表達式。

在任何一種情況下,使用盡可能多的不同輸入(包括無效輸入)來實施單元測試,以便您可以驗證您的算法在修改后仍然有效。

作為直接匹配lastname, firstname middlename的替代方法,您可以使用 String.split 並提供一個匹配分隔符的正則表達式。 例如:

static String[] lastFirstMiddle(String input){
    String[] result=input.split("[,\\s]+");
    System.out.println(Arrays.asList(result));
    return result;
}

我用輸入測試了這個

"Müller,   firstname  middlename"
"Müller,firstname  middlename"
 "O'Gara, Ronan Ramón"

注意:這種方法對於包含空格的姓氏會失敗,例如“van der Heuvel”、“de Valera”、“mac Piarais”或“bin Laden”,但話說回來,OP 的原始規范似乎不允許姓氏中有空格(或其他名字。我和“瑪麗·凱特”一起工作。那是她的名字,不是名字和中間名)。 http://www.w3.org/International/questions/qa-personal-names上有一個關於個人姓名的有趣頁面

^([a-zA-Z]+)\s*,\s*([a-zA-Z]+)\s+([a-zA-Z]+)$

我認為您正在尋找這個。只需抓住組來滿足您的需求。參見演示。

http://regex101.com/r/hQ1rP0/6

我認為這個也可以工作,而且比你的短一點:

([A-Z][a-z]*)(?:,\s*)?

演示

或者你可以使用這個正則表達式來使用 split:

(,?\s+)
import re
def rearrange_name(name):
  result = re.search(r"^([\w \.-]*), ([\w \.-]*)$", name)  #Included extra characters i.e. .- to be captured in our groups in the event they are found.
  #result = re.search(r"^([\w .-]*), ([\w .-]*)$", name)  #seems to be also working without escaping the period
  if result == None:
    return name
  return "{} {}".format(result[2], result[1])

name=rearrange_name("Raila, Odinga M.")
print(name)`enter code here`
import re

def rearrange_name(name):
    result = re.search(r"^([\w \.-]*), ([\w \.-]*)$", name)
    if result == None:
        return name
    return "{} {}".format(result[2], result[1])

name = rearrange_name("Erick, Bett K.")
print(name)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM