Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式以匹配用户和user@domain_Java_Regex - Fatal编程技术网

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

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) 用户

用户可以“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)
用户标识返回“user@test". 我尝试了各种表达方式,但似乎没有什么符合我的要求:-(

有什么想法吗?

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

你可以用

String userId = s.replaceFirst("^([^@]+).*", "$1");

详细信息

  • ^
    -字符串的开头
  • ([^@]+)
    -第1组(在替换模式中用
    $1
    表示):除
    @
  • *
    -字符串的其余部分

如果您使用的是java,并且有一个像您提供的那样简单的案例,我建议您保持简单,在本例中不要依赖正则表达式

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

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