我有一个字符串:blah1 blah2 username@emailaddress.com.au randomblah
单词blah1
和blah2
不会发生变化。电子邮件地址和randomblah
将会更改。
我想使用正则表达式(在Java中)提取用户名。我已经尝试过最接近的一些事情
/blah2 .*(?=(@))/
这给了我blah2 username
我无法弄清楚如何从摘录中排除blah2
。
答案 0 :(得分:0)
它在ruby中,所以这可能不适用于java,但基本的想法是这样的。
regex = /^.* (?<username>.*)@.*$/
result = regex.match "blah1 blah2 username@emailaddress.com.au randomblah"
puts result[:username] # output is 'username'
*请注意^.*
和(?<.
^
表示字符串的开头,$
表示字符串的结尾。
.*
表示匹配下一个模式之前的任何字符,在这种情况下是空格
请注意,匹配在这里实际上意味着忽略它们,因为我们正在捕获下一个特定模式。
在.*
旁边,有一个空格,用于标记我们想要捕获的特定模式的开头。
接下来,我们捕获所有内容(.*
)空白后 @
之前的。我们按()
标记。我们通过在username
内明确写username
来将其命名为?<>
。
然后我们匹配在行结束之前发生的所有事情。请注意,这也意味着忽略它们。
这是红宝石,因此Java中的匹配和捕获语法可能不同,但希望基本的想法是相同的。
答案 1 :(得分:0)
答案 2 :(得分:0)
使用\s+(\w+)@
。这将匹配属于[a-zA-Z0-9_]
的所有用户名。如果您的用户名可以包含其他特殊字符,请相应地替换\w
。您可以尝试此代码,它将提取用户名。
import java.util.regex.*;
public class RegexTest{
public static void main(String []args){
String data = "blah1 blah2 username@emailaddress.com.au randomblah";
String regex = "\\s+(\\w+)@";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(data);
if(m.find())
System.out.println(m.group(1));
}
}
输出:用户名
答案 3 :(得分:0)
regexFindString = Regex("\w*@\w*.\")
if regexFindString.Matches(String):
regexFIRST = Regex("blah1 blah2 ")
regexSECOND = Regex("@\w+")
x = Regex.Replace(FIRST, "")
x = Regex.Replace(SECOND, "")
我的正则表达式可能生锈,但想法是: 取出字符串并将其与符号之后的正则表达式相匹配,例如&#34; @&#34;或&#34;。&#34; /&#34; .com&#34;。 然后创建两个具有这些确切字符的正则表达式(&#34; blah1 blah2&#34;和&#34; @&#34;或&#34;。&#34; /&#34; .com&#34;) 。 当你拿到它们时,只需用空字符串替换它们:&#34;&#34;并为您的用户名(x)提供字符串的新值。那是你的用户名。
答案 4 :(得分:0)
使用电子邮件地址正则表达式的错误1正在重新发明轮子并且滚动自己的正则表达式。
regular-expressions.info有一些关于这个主题的有用材料,包括常见陷阱和有用的正则表达式的大致概述,应该满足您的需求:
/* 1 */
{
"_id" : "A",
"trueCount" : 4,
"falseCount" : 1
}
/* 2 */
{
"_id" : "B",
"trueCount" : 3,
"falseCount" : 2
}
您可以通过添加一些大括号来修改它以使用正则表达式组提取用户名。
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b.
因此,使用
(\b[A-Z0-9._%+-]+)@[A-Z0-9.-]+\.[A-Z]{2,}\b.
遍历字符串中的匹配项并matcher.find()
来提取用户名。