Java 正则表达式以匹配用户和user@domain
用户可以“user”或“as”登录user@domain". 我只想在这两种情况下提取“user”。我正在寻找一个匹配的表达,以适应它,但我挣扎Java 正则表达式以匹配用户和user@domain,java,regex,Java,Regex,用户可以“user”或“as”登录user@domain". 我只想在这两种情况下提取“user”。我正在寻找一个匹配的表达,以适应它,但我挣扎 final Pattern userIdPattern = Pattern.compile("(.*)[@]{0,1}.*"); final Matcher fieldMatcher = userIdPattern.matcher("user@test"); final String userId = fieldMatcher.group(1) 用户
final Pattern userIdPattern = Pattern.compile("(.*)[@]{0,1}.*");
final Matcher fieldMatcher = userIdPattern.matcher("user@test");
final String userId = fieldMatcher.group(1)
用户标识返回“user@test". 我尝试了各种表达方式,但似乎没有什么符合我的要求:-(
有什么想法吗?如果您使用”(.*)[@]{0,1}.*“
模式与.matches()
,则(.*)
首先获取整行,然后,当正则表达式索引仍在行的末尾时,[@{0,1}
模式在行尾触发并匹配,因为它可以匹配0个@
字符,然后*
再次在该位置匹配,因为它匹配任何0个以上的字符。因此,整条行都会落在组1中
你可以用
String userId = s.replaceFirst("^([^@]+).*", "$1");
看
详细信息
-字符串的开头^
-第1组(在替换模式中用([^@]+)
表示):除$1
@
-字符串的其余部分*
String userId = "user@test";
if (userId.indexOf("@") != -1)
userId = userId.substring(0, userId.indexOf("@"));
// from here on userId will be "user".
这将始终删除“@test”,或者在它不存在时跳过删除它
在大多数情况下,使用正则表达式会使代码在未来的其他开发人员中不易维护,因为至少以我的经验来看,大多数开发人员对正则表达式不是很在行。一点谷歌搜索得出以下结论:
(.*?)(?=@|$)
将匹配可选@之前的所有内容。您将
@
作为可选项,因此匹配将尝试获取最长的用户名。由于您未设置用户名限制,因此不允许在其中包含@
s,因此匹配的字符串最长
只需使用:
[^@]*
作为用户名的匹配子表达式(并使用$0
获取匹配字符串)
或者,您可以使用它来查找多个匹配项(并获取用户部分和域部分):
\b
强制将字符串绑定到单词边界,然后第一组匹配非空格和非@
字符(任何数字,最好使用+
而不是*
,因为用户名后面必须至少有一个字符)(可选)通过一个@
和另一个非空格和非@
字符字符串)。在这种情况下,$0
与整个电子邮件地址匹配,$1
与用户名部分匹配,$2
与@domain
部分匹配(您可以细化为仅域部分,添加一对新括号,如中所示)
b([^@\s]*)(@([^@\s]*))?\b
请参阅。您必须在那里也有
if(fieldMatcher.find())
,对吗?请尝试String userId=s.replaceFirst(“^([^@]+)*”,“$1”);
(.*)@?*
可能是您的String.split(“@”)[0]
请参阅我从何处获得此模式取决于使用此模式的Java代码,它可能无法达到预期效果。@WiktorStribiżew我很感兴趣…为什么不能?如果与.matches()一起使用它,第1组为user@domain.com
string将是整个字符串。您借用了PHP相关问题中的模式,在PHP中,preg\u match
函数返回部分匹配。谢谢,这回答了我的问题。允许管理员根据自己的需要编辑匹配模式。因此我将使用此:final pattern userIdPattern=Pattern.compile(([^@]+)[@]{0,1}.*);
@Henfo[@]{0,1}
是冗余的,模式内部是否有[@]{0,1}
没有区别。
b([^@\s]*)(@([^@\s]*))?\b