我运行的VB.NET程序接收火灾寻呼机消息(我是一名志愿者),该程序的一个功能是尝试从消息中提取地址。如果我很幸运,消息将被编码为前面的前缀(例如LOC
)然后是地址,但是我不幸运,格式一直在变化,所以我需要尝试提出一个正则表达式这涵盖了大多数地址格式。
所有消息的结尾格式相同,通常是melways引用(M
按页面和网格引用继续)或其他一些地图,所以我有我的终点(?=SV[NCSEWV]| M |SVVB)
和我希望消息在该点之前开始(因为这个原因,我从右向左跑)。
消息的开头有所不同,如果我很幸运,它是一个角落地址并且有CNR
或街道号码,在这种情况下我可以使用(CNR|ASSEMBLE AT|(([\d]+/[\d]+)|([\d]+ / [\d]+)|([\d]+-[\d]+)|([\d]+ - [\d]+)|( [\d]+ )))
并在中间使用{{1 }}
所以我感到困惑的是,在我的正则表达式示例中,它不起作用,我想尝试优先考虑先尝试这个,然后接下来的事情,然后接下来的事情,但我不能得到这个工作。
这些是带地址的示例消息(我已将地址更改为随机街道)。
.*?
所以当我在最底层使用我的正则表达式时,只有前三个工作,而后三个不工作。我希望我能得到正则表达式的是:
如果是街道号码或ALERT F1234567 PKHM2 STRUC1 BURNING SMELL INSIDE HOUSE 19 THIS ROAD BVD SUBURB /NEAREST ST CR M 123 B8 (660846)
ALERT F1234567 PKHM2 STRUC1 HOUSE FULL OF SMOKE 7 EXAMPLE CT SUBURB /CROSSRD1 BVD //CROSSRD2 CCT M 123 K10 (653837)
ALERT F1234567 PKHM2 NOSTC1 CAR FIRE CNR EXAMPLE1 CL/EXAMPLE2 WAY SUBURB M 123 J6 (646853)
ALERT F1234567 PKHM1 STRUC1 FACTORY FIRE EXAMPLE RD SUBURB M 123 J11 (686833)
ALERT F1234567 PAKU5 STRUC1 BBQ AREA ON FIRE EXAMPLE RD SUBURB M 123 G7 (677948)
ALERT F1234567 SFLD3 G&SC1 COLUMN OF SMOKE ISSUING EXAMPLE RD SUBURB SVC 1234 H3 (075622)
,请将地址(不包括地图参考)带到CNR
或街道号码,例如在第一个例子中,这将是:CNR
。
如果不存在,但其他一个短语是(例如19 THIS ROAD BVD SUBURB /NEAREST ST CR
),则取不包含该短语的地址和地图参考。因此,来电FIRE
将成为ALERT F1234567 PKHM1 STRUC1 FACTORY FIRE EXAMPLE RD SUBURB M 123 J11 (686833)
。
我很好奇的另一件事是我可以把它作为有三个或更多选项的东西,所以如果它存在则采用正则表达式1,如果不存在则采用正则表达式2,那么如果不采用正则表达式3存在。
所以例如,如果我有EXAMPLE RD SUBURB
这样的调用,第一个正则表达式会查找123(或CNR),如果找到它包含在返回的正则表达式中,那么如果它不存在则查找ALERT F1234567 PKHM1 STRUC1 FACTORY FIRE 123 EXAMPLE RD SUBURB M 123 J11 (686833)
但不包含在返回的正则表达式中,然后如果找不到它,它会查找(FACTORY FIRE|GAS LEAK|EXAMPLE 1|EXAMPLE 2|EXAMPLE 3)
,并且不会在返回的正则表达式中包含它。
因此,上述(STRUC[13]|INCIC[13])
的示例1返回ALERT F1234567 PKHM1 STRUC1 FACTORY FIRE 123 EXAMPLE RD SUBURB M 123 J11 (686833)
。
上述123 EXAMPLE RD SUBURB
的示例2返回ALERT F1234567 PKHM1 STRUC1 FACTORY FIRE EXAMPLE RD SUBURB M 123 J11 (686833)
。
以上EXAMPLE RD SUBURB
的示例3。
正则表达式:
ALERT F1234567 PKHM1 STRUC1 EXAMPLE RD SUBURB M 123 J11 (686833) returns EXAMPLE RD SUBURB