我正在尝试从他的电子邮件中获取用户名。我知道有很简单的方法可以实现这一点,但它让我想知道我是否可以使用正则表达式实现这一点。
假设用户输入以下电子邮件:[email protected]
从该字符串,我想提取:用户肯定的名称
我到目前为止尝试过:
([a-zA-Z]+)
但有了这个,域名包括在内。使用.*(?=@)
,我可以在'@'之前获得所有内容。
我不知道如何将两者结合起来实现我的目标。
有小费吗?谢谢!
到目前为止提出的答案似乎已经错过了将两个想法合并为一个正则表达式的意图。当然,使用两个更简单。但是,可以通过使用匹配器组并仅收集我们感兴趣的组中的数据来完成。
Java 8版本:
public static void main(String[] args) {
Pattern p = Pattern.compile("([a-zA-Z]+)[^a-zA-Z@]*(@.*)?");
String input="[email protected]";
System.out.println(MatcherStream.results(p, input)
.map(result -> result.group(1))
.collect(Collectors.joining(" ")));
// MatcherStream implementation http://stackoverflow.com/a/42462014/7098259
}
Java 9版本:
在Java 9中流式传输匹配结果更方便。
public static void main(String[] args) {
System.out.println(Pattern.compile("([a-zA-Z]+)[^a-zA-Z@]*(@.*)?")
.matcher("[email protected]").results()
.map(result -> result.group(1))
.collect(Collectors.joining(" ")));
}
replaceAll版本:
最后,这个不是纯粹的正则表达式解决方案,因为它要求你在最后修剪一个额外的空格字符。但是你可以看到使用replaceAll更加简洁:
public static void main(String[] args) {
String input = "[email protected]";
System.out.println(input.replaceAll("((@.*)|[^a-zA-Z])+", " ").trim());
}
输出:
用户姓
使用以下内容:
email.replaceAll("@.*","").replaceAll("[^a-zA-Z]+", " ").trim();
这将有效地删除@
符号后的任何内容,然后在剩下的部分将用单个空格替换所有非字母字符序列。最后,调用trim
方法来删除初始和最终空格,以防你在电子邮件地址'用户部分的末尾或开头有123
。
在Java中,您可以使用Matcher类使用正则表达式提取电子邮件的用户名部分。为了替换非字母和非数字符号,我建议您在提取文本后使用String类中的replaceAll
方法:
java.util.regex.Pattern p = java.util.regex.Pattern.compile("^([^@]+)");
java.util.regex.Matcher m = p.matcher("[email protected]");
String userName = null;
if (m.find()) {
userName = m.group(0).replaceAll("[^a-zA-Z]", " ");
}
这是我使用正则表达式模式与组的简单解决方案:
private static final Pattern EMAIL = Pattern.compile("(?<one>[^\\.]+)\\.(?<two>[^_]+)_(?<three>[^@\\d]+).+");
public static String getName(String email) {
Matcher matcher = EMAIL.matcher(email);
return matcher.matches() ? matcher.group("one") + ' ' + matcher.group("two") + ' ' + matcher.group("three") : null;
}
这是Demo at regex101.com的链接
String email = "[email protected]";
String result = email.replaceAll("@.+$", ""); //user.sure_name123
result = result.replaceAll("\\W+"," "); //user sure name123