我正在尝试从字符串中提取姓氏和名字的第一个字符,但到目前为止还没有运气。(尝试在线搜索多个solutiosn,也没有运气) 因此,例如,如果这是字符串:
name = A A BCD EFG
我只想显示A和E(例如AE)。 我正在尝试找出是否有更简单的方法可以做到这一点。我正在使用的正则表达式确实为我提供了第一个字符,但对最后一个字符却不起作用,它返回(AEFG),也就是整个姓氏。 有办法解决吗?这是我的代码:
String lastName = "";
String firstName= "";
if(name.split("\\w+").length>1){
lastName = name.substring(name.lastIndexOf(" ")+1,1);
firstName = name.substring(0,1);
}
else{
firstName = name;
}
String completeInitials = firstName + " " + lastName;
答案 0 :(得分:6)
您可以使用此正则表达式捕获组1中名字的第一个字母和组2中姓氏的第一个字母,并用$1$2
替换整个匹配项以获取所需的字符串。
^\s*([a-zA-Z]).*\s+([a-zA-Z])\S+$
说明:
^
-字符串的开头\s*
-匹配可选的空白([a-zA-Z])
-匹配名字的第一个字母并将其捕获到group1中.*\s+
-此处.*
贪婪地匹配任何文本,\s+
确保它匹配姓氏前的最后一个空格([a-zA-Z])
-这将捕获姓氏的第一个字母并将其捕获到group2中\S+$
-匹配姓氏的剩余部分和输入的结尾Java代码
String s = "A A BCD EFG";
System.out.println(s.replaceAll("^\\s*([a-zA-Z]).*\\s+([a-zA-Z])\\S+$", "$1$2"));
打印
AE
编辑:要将名称转换为大写字母,以防大写,如果名称使用小写字母,则在基于PCRE的正则表达式中,您可以在替换前使用\U
\U$1$2
,但由于本文是Java编写的,因此无法正常工作,因此您可以使用.toUpperCase()
Demo for ensuring the replaced text is in upper case
相同的Java代码将使用.toUpperCase()
String s = "a A BCD eFG";
System.out.println(s.replaceAll("^\\s*([a-zA-Z]).*\\s+([a-zA-Z])\\S+$", "$1$2").toUpperCase());
尽管输入字符串为小写,但仍以大写形式打印
AE
答案 1 :(得分:0)
这是怎么回事:将名称String
分成几部分。然后采用第一部分和最后一部分的第一个char
。
如果只提供名字或姓氏,则此解决方案会同时打印首字母(名字和姓氏)和一个名字(名字)。
private void printInitials(String name) {
String[] nameParts = name.split(" ");
String firstName = nameParts[0];
char firstNameChar = firstName.charAt(0);
if (nameParts.length > 1) {
System.out.println("First character of first name: " + firstNameChar);
String lastName = nameParts[nameParts.length - 1];
char lastNameChar = lastName.charAt(0);
System.out.println("First character of last name: " + lastNameChar);
}
else {
System.out.println("First character name: " + firstNameChar);
}
}
因此,对于A A BCD EFG
,它会打印:
First character of first name: A
First character of last name: E
如果是'AABCDEFG',它将打印:
First character name: A