我有一个我正在解析的文件,总是包含一个电子邮件地址。该文件目前使用@
之前的前导空格进行布局,我们希望捕获该域。
foo @bar.com more data here
foo @foo.com more data here
我们要提取@bar.com
和@foo.com
,我刚开始使用正则表达式。我试图将“ @在一个单词边界的开头拉出来,包括所有后面的字符直到下一个单词边界”。
我已经尝试了以下各种迭代,为@
文字分组事物,方形支持......但似乎没有任何效果。
编辑 - 实际代码:
import java.util.regex.*;
import java.io.*;
import java.nio.file.*;
import java.lang.*;
//
public class eadd
{
public static void main(String args[])
{
String inputLine = "foo foofoo foo foo @bar.com foofoofoo foo foo foo";
String eDomain = "";
// parse eadd
Pattern p2 = Pattern.compile("(\\b@.*\\b)");
Matcher m2 = p2.matcher(inputLine);
if(m2.matches()) {
eDomain = m2.group(1);
} else {
eDomain = "n/a";
}
System.out.println(p2+" "+m2+" "+eDomain);
}
}
我运行时的结果。
(\b@.*\b) java.util.regex.Matcher[pattern=(\b@.*\b) region=0,49 lastmatch=] n/a
我的所有问题都与@
被搜索为文字而非模式(例如,寻找.*
而不是any and all characters
)的内容有关。我找不到@
作为控制角色的引用,所以我认为我不需要逃脱。
Oracle的java教程或文档中没有类似的例子,也没有我检查过的任何在线资源;我一直无法找到人们如何处理这个问题的其他样本。就像我说的那样,我对正则表达式相当新,但这对我来说就像它应该对我有用。我错过了什么?
答案 0 :(得分:2)
Pattern p = Pattern.compile("(@(?:[a-z][A-Z0-9_]+)\\.(?:[a-z][A-Z]+))");
这应该适合你。
这个正则表达式开始寻找@。之后,它会查找"。"后面跟着另一个单词的任何单词。为了熟悉语法,您可以查看this。
答案 1 :(得分:2)
Java不会将@
视为单词字符 - 因此在您的地址开头没有单词边界。您可以使用简单的空白匹配替换单词边界:
"\s(@.+?)\b"
(或"\\s(@.+?)\\b"
,因为这是Java)应该做的伎俩。它查找后跟@
的空格,并匹配到下一个单词边界。
编辑:糟糕,.
,就像@
一样,不是单词字符(duh)。使用
"\\s(@.+?)(?:\\s|$)"
匹配到下一个空格或EOF。 (?:\\s|$)
是一个非捕获组,它将匹配任何空格或输入结束。
答案 2 :(得分:1)
试试这个:Pattern p = Pattern.compile("(?<=\\s)(@(?:bar|foo)\\.com\\b)");
或通用模式:
"(?<=\\s)(@\\w+(?:\\.\\w+)+\\b)"
说明:
(?<=\\s)
:在@
之前查看匹配前导空格的背后
\\w
:匹配字母,数字,下划线
\\b
:字边界
@\\w+(?:\\.\\w+)+
:匹配@bar.com
,@bar.com.au
,@bar.com.xyz
,@bar.foo.xx.yy.zz