正则表达式以匹配用户和user @ domain

时间:2018-11-20 19:49:49

标签: java regex

用户可以以“用户”或“ user @ domain”身份登录。在这两种情况下,我只想提取“用户”。我正在寻找适合它的匹配表达,但是我很挣扎。

final Pattern userIdPattern = Pattern.compile("(.*)[@]{0,1}.*");
final Matcher fieldMatcher = userIdPattern.matcher("user@test");
final String userId = fieldMatcher.group(1)

userId返回“ user @ test”。我尝试了各种表达式,但似乎没有什么适合我的要求:-(

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果将"(.*)[@]{0,1}.*"模式与.matches()一起使用,则(.*)首先会抓取整行,然后,当正则表达式索引仍位于行尾时,{{1 }}模式在行尾触发并匹配,因为它可以匹配0个[@]{0,1}字符,然后@再次在该位置匹配,因为它匹配任何0+个字符。因此,整行都落在您的第1组中。

您可以使用

.*

请参见regex demo

详细信息

  • String userId = s.replaceFirst("^([^@]+).*", "$1"); -字符串的开头
  • ^-第1组(在替换模式中称为([^@]+)):除$1之外的任意1个以上的字符
  • @-字符串的其余部分。

答案 1 :(得分:1)

进行了一些谷歌搜索:

(.*?)(?=@|$)

将匹配所有可选@@ p之前的内容

答案 2 :(得分:0)

如果您使用的是Java,并且有一个像您提供的简单案例,我建议在这种情况下保持简单而不依赖于正则表达式。

您可以简单地执行以下操作:

String userId = "user@test";

if (userId.indexOf("@") != -1)
    userId = userId.substring(0, userId.indexOf("@"));

// from here on userId will be "user".

这总是会删除“ @test”,或者只是跳过不存在的“ @test”。

在大多数情况下,使用正则表达式会使代码在将来无法由其他开发人员维护,因为至少根据我的经验,大多数开发人员都不太擅长使用正则表达式。

答案 3 :(得分:0)

您将@作为可选内容包括在内,因此匹配尝试获取最长的用户名。如您所愿,用户名的限制不允许其中包含@,它与最长的字符串匹配。

只需使用:

[^@]*

作为用户名的匹配子表达式(并使用$0获取匹配的字符串)

或者您可以使用this one来查找多个匹配项(并同时获得用户部分和域部分):

\b([^@\s]*)(@[^@\s]*)?\b

\b强制将字符串绑定到单词边界,然后第一组匹配非空格和非@字符(任何数字,最好使用+代替*,因为用户名必须至少包含一个字符)(后跟(可选)一个@以及另一串非空格和非@字符)。在这种情况下,$0匹配整个电子邮件地址,$1匹配用户名部分,而$2匹配@domain部分(您可以将其细化为域部分,添加一个新的括号对,如

b([^@\s]*)(@([^@\s]*))?\b

请参见demo