使用Java / regex从String中提取数据

时间:2011-03-15 16:48:52

标签: java regex

我正在尝试从此字符串中提取数据:

  

你好。 Blah blahblah等等   建筑016814 - 门01002   BlahBLAHblah DUHHH 78787等等,Blah   blah Building Dr 4647 8989 BLAHBlah   blah blahBlah

我希望遍历String并将Building和Door编号的每个实例拉出并输出到控制台。但是,由于建筑物和门号的实例彼此不同,我知道我需要使用两种不同的正则表达式模式。

这是我的代码:

public static void main(String agrs[]) {
    String myStr = "Hello there. Blah blahblah blah Building 016814 - Door 01002"+
           " BlahBLAHblah DUHHH 78787 blah, Blah blah Building Dr 4647 8989 BLAHBlah blah blahBlah";

    Pattern p = Pattern.compile("Building.+?(?:[Dd]).+?(\\d+).+?(\\d+)");
    Pattern p1 = Pattern.compile("Building.+?(\\d+).+?(?:[Dd]).+?(\\d+)");

    Matcher m = p.matcher(myStr);
    Matcher m1 = p1.matcher(myStr);

    while(m1.find() && m.find()) {
         System.out.print(" Building " + m1.group(1) + " " + "Door ");
         System.out.print(m1.group(2));
         System.out.print(" Building " + m.group(1)+" "+ "Door "+m.group(2));
    }

这是我的输出:

Building 016814 Door 01002 Building 01002 Door 78787

我知道它与我的p正则表达式模式有关。它似乎在拉动任何数字。我是正则表达式的新手,所以如果您需要更多关于此的信息,请告诉我。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我相信我已经找到了自己问题的答案。非常感谢你的投入;非常感激。

我用过:

Building[ ][Dd].+?(\\d+).+?(\\d+)

我的输出是:

  

建筑物016814门01002建筑物4647门8989

答案 1 :(得分:0)

您的(.+?)部分过于宽泛。试试这个:

"\\b((?:Building|Door|Dr)\\s\\d+)\\b"

然后抓住组1中捕获的内容。确保在不需要的情况下关闭区分大小写的匹配。

我猜你想要的结果。你可能实际上正在寻找这个:

"\\b(Building\\s\\d+)\\s(Door\\s\\d+)\\b"

编辑:根据您的评论,我能想到的最简单的方法是:

"\\bBuilding\\s(?:(\\d+)\\sDoor\\s(\\d+)|Dr\\s(\\d+)\\s(\\d+))\\b"

为清晰起见,删除加倍的反斜杠:

/\bBuilding\s(?:(\d+)\sDoor\s(\d+)|Dr\s(\d+)\s(\d+))\b/