用户可以以“用户”或“ 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”。我尝试了各种表达式,但似乎没有什么适合我的要求:-(
有什么想法吗?
答案 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。