使用正则表达式获取字符串中每个单词的第一个字母

时间:2011-09-27 18:17:56

标签: java regex

我正在尝试使用正则表达式获取字符串中每个单词的第一个字母,这是我尝试过的:

public class Test
{
    public static void main(String[] args)
    {
        String name = "First Middle Last";
        for(String s : name.split("(?<=[\\S])[\\S]+")) System.out.println(s);
    }
}

输出如下:

F
 M
 L

如何修复正则表达式以获得正确的输出?

6 个答案:

答案 0 :(得分:5)

修改在评论中提出了一些建议,但保留了\S,因为\w只是字母数字,可能会在任何其他符号上意外中断。

修复正则表达式并仍然使用split:

name.split("(?<=[\\S])[\\S]*\\s*")

答案 1 :(得分:1)

为什么不简单:

public static void main(String[] args)
{
    String name = "First Middle Last";
    for(String s : name.split("\\s+")) System.out.println(s.charAt(0));
}   

答案 2 :(得分:1)

(免责声明:我没有使用Java的经验,所以如果它以一种无用的方式处理正则表达式,我会道歉。)

如果你的意思是去除M和L之前的空格,请尝试在末尾添加可选的空格

(?<=[\\S])[\\S]+\\s*

但是,在单字母单词的情况下,这可能会增加额外的空间。这可能会解决这个问题:

(?<=[\\S])[\\S]*\\s*

答案 3 :(得分:1)

有时使用不同的技术会更容易。特别是,没有方便的方法来“获得所有匹配的区域”(你可以建立自己的,但这感觉很费劲)。所以我们转变为我们可以处理的事情:

String name = "First Middle Last";
for (String s : name.replaceAll("\\W*(\\w)\\w*\\W*","$1").split("\\B"))
    System.out.println(s);

如果我们被允许假设没有前导或尾随的非单词字符,我们可以稍微简化一下:

String name = "First Middle Last";
for (String s : name.replaceAll("(\\w)\\w*","$1").split("\\W+"))
    System.out.println(s);

答案 4 :(得分:1)

我最近在一次采访中遇到了这个问题,并在看完这个问题后想出了这个解决方案。

String input = "First Middle Last";
Pattern p = Pattern.compile("(?<=\\s+|^)\\w");
Matcher m = p.matcher(input);

while (m.find()) {
    System.out.println(m.group());
}

这个正则表达式不会在字符串的开头拾取非单词字符。因此,如果有人输入&#34; Mike!sis Strawberry&#34;,则返回将为M,S。所选择的答案不是返回M,!,S

的情况。

正则表达式的工作原理是搜索具有一个或多个空格字符(\ s +)或位于行的开头(^)的单个字符(\ w)。

要修改搜索内容,\ w可以更改为其他正则表达式有效条目。

要修改搜索字符前面的内容,请修改(\ s + | ^)。在此示例中,\ s +用于查找一个或多个空格,^用于确定字符是否位于正在搜索的字符串的开头。要添加其他条件,请添加管道字符,然后添加有效的正则表达式搜索条目。

答案 5 :(得分:0)

它没有修复正则表达式,但是在输出字符串中添加.trim()仍然有效:

String name = "First Middle Last";
for(String s : name.split("(?<=[\\S])[\\S]+")) System.out.println(s.trim());

输出:

F
M
L