Java:正则表达式模式不起作用

时间:2012-08-08 15:09:57

标签: java regex

我有一个我正在解析的文件,总是包含一个电子邮件地址。该文件目前使用@之前的前导空格进行布局,我们希望捕获该域。

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

3 个答案:

答案 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