java - 使用正则表达式从电子邮件中提取姓名

标签 java regex

我正在尝试从他的电子邮件中获取用户名。我知道有很多简单的方法可以实现这一目标,但这让我想知道是否可以仅使用正则表达式来实现这一目标。

假设用户输入以下电子邮件:user.sure_name123@mail.co

我想从该字符串中提取:用户确定名称

到目前为止我已经尝试过:

([a-zA-Z]+)

但是这样,域就被包含在内了。使用 .*(?=@) 我可以获得“@”之前的所有内容。

我不知道如何将两者结合起来来实现我的目标。

有什么建议吗?谢谢!

最佳答案

到目前为止提出的答案似乎没有达到您将这两种想法合并到一个正则表达式中的意图。当然,使用两个更简单。但是,可以通过使用匹配器组并仅从我们感兴趣的组收集数据来完成。

Java 8 版本:

public static void main(String[] args) {
    Pattern p = Pattern.compile("([a-zA-Z]+)[^a-zA-Z@]*(@.*)?");
    String input="user.sure_name123@mail.co";
    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("user.sure_name123@mail.co").results()
            .map(result -> result.group(1))
            .collect(Collectors.joining(" ")));
}

替换所有版本:

最后,这不是一个纯粹的正则表达式解决方案,因为它要求您在末尾修剪掉多余的空格字符。但正如您所看到的,使用replaceAll 更加简洁:

public static void main(String[] args) {
    String input = "user.sure_name123@mail.co";
    System.out.println(input.replaceAll("((@.*)|[^a-zA-Z])+", " ").trim());
}

输出:

user sure name

关于java - 使用正则表达式从电子邮件中提取姓名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49494188/

相关文章:

javascript - 与 Pagedown 的 PreBlockGamut 链接

c++ - 如何迭代 std::string 中的所有正则表达式匹配及其在 c++11 std::regex 中的起始位置?

正则表达式组选择

java - 如果语句为 false 时运行

java - Android - 扩展应用程序类时 landroid/app/instrumentation 无法访问

java - 带有 cookies/session 的 HttpClient 4.x httpGet

java - 在简单的java服务器上部署servlet

python - 如何使用正则表达式提取第二个大写字母后的所有文本(数字、字母、符号)?

PHP 正则表达式 - 仅过滤器编号

java - 了解 "ImageIO.read(getClass().getResource(path))"