我正在尝试从此字符串中提取数据:
你好。 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
正则表达式模式有关。它似乎在拉动任何数字。我是正则表达式的新手,所以如果您需要更多关于此的信息,请告诉我。任何帮助将不胜感激。
答案 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/