0

我有一个我正在解析的文件,它总是包含一个电子邮件地址。该文件当前布局在 之前有一个前导空格@,我们要捕获域。

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教程或文档中没有类似的例子,SO,也没有我查过的任何在线资源;我一直无法找到人们如何处理这个问题的其他样本。就像我说的,我对正则表达式相当陌生,但这在我看来应该对我有用。我错过了什么?

4

3 回答 3

2
Pattern p = Pattern.compile("(@(?:[a-z][A-Z0-9_]+)\\.(?:[a-z][A-Z]+))");

这应该适合你。

这个正则表达式开始寻找 @ 。之后,它会查找后跟“.”的任何单词,然后是另一个单词。为了熟悉语法,您可以看一下这个

于 2012-08-08T15:14:02.050 回答
2

Java 不会将@其视为单词字符 - 因此地址开头没有单词边界。您可以用简单的空格匹配替换单词边界:

"\s(@.+?)\b"

(或者"\\s(@.+?)\\b"因为这是Java)应该可以解决问题。它查找后面的空格@并匹配直到下一个单词边界。

编辑:哎呀,.就像 一样@,不是单词字符(duh)。利用

"\\s(@.+?)(?:\\s|$)"

匹配直到下一个空格或 EOF。(?:\\s|$)是一个非捕获组,它将匹配任何空格或输入结尾。

于 2012-08-08T15:23:14.997 回答
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

于 2012-08-08T15:21:32.767 回答