我正在尝试使用正则表达式获取字符串中每个单词的第一个字母,这是我尝试过的:
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
如何修复正则表达式以获得正确的输出?
答案 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