Regex 使用正则表达式从fire寻呼机消息中提取地址

Regex 使用正则表达式从fire寻呼机消息中提取地址,regex,parsing,Regex,Parsing,我运行了一个VB.NET程序来接收fire寻呼机消息(我是一名志愿者),该程序的功能之一是尝试从消息中提取地址。如果我幸运的话,这些消息会在它们前面加上前缀(例如,LOC),然后是地址,但是我不幸运,格式一直在变化,所以我需要尝试并想出一个覆盖大多数地址格式的正则表达式 所有消息的结尾都有相同的格式,通常是melways引用(M按页面和网格引用进行)或其他一些映射,因此我有我的端点(?=SV[NCSEWV]| M | SVVB),我希望消息在该点之前开始(出于这个原因,我从右向左运行) >消息

我运行了一个VB.NET程序来接收fire寻呼机消息(我是一名志愿者),该程序的功能之一是尝试从消息中提取地址。如果我幸运的话,这些消息会在它们前面加上前缀(例如,
LOC
),然后是地址,但是我不幸运,格式一直在变化,所以我需要尝试并想出一个覆盖大多数地址格式的正则表达式

所有消息的结尾都有相同的格式,通常是melways引用(
M
按页面和网格引用进行)或其他一些映射,因此我有我的端点
(?=SV[NCSEWV]| M | SVVB)
,我希望消息在该点之前开始(出于这个原因,我从右向左运行)

<> >消息的开始变化,如果幸运的话,它是一个拐角地址,并且有<代码> CNR < /代码>,或者在街道情况下,我可以使用<代码>(CN[R]汇编在[[ [\d++/[d] +)]([\d++/[d] +)]([\d++[\d] +)[[\d++[\d] + ]([\d] +)[< /代码> ]中使用<代码> *> <代码> < /p> 因此,我感到困惑的是,在我下面的正则表达式示例中,它不起作用,我想先尝试一下,然后是下一件事,然后是下一件事,但我无法让它起作用

这些是一些带有地址的示例消息(我已将地址更改为随机街道)

因此,当我在最底层使用正则表达式时,只有前三个起作用,而后三个不起作用。我希望我能让regex做的是:

  • 如果有街道编号,或
    CNR
    ,则将地址(不包括地图参考)带到
    CNR
    或街道编号,例如,在第一个示例中,这将是:
    19本路BVD郊区/最近的ST CR

  • 如果不存在该短语,但其中一个短语是(例如,
    FIRE
    ),则使用不包括该短语的地址和地图参考。因此,火灾呼叫
    警报F1234567 PKHM1 STRUC1工厂火灾示例RD郊区M 123 J11(686833)
    将变为
    示例RD郊区

另一件我很好奇的事情是,我可以把它作为有三个或更多选项的东西,所以如果它存在,就取正则表达式1,如果它不存在,就取正则表达式2,如果它存在,就取正则表达式3

例如,如果我有一个调用,比如
警报F1234567 PKHM1 STRUC1工厂火灾123示例RD郊区M 123 J11(686833)
,第一个正则表达式将查找123(或CNR),如果找到,则将其包含在返回的正则表达式中,如果不存在,则查找
(工厂火灾|气体泄漏|示例1 |示例2 |示例3)
但不将其包含在返回的正则表达式中,如果未找到,则查找
(STRUC[13]| INCIC[13])
,而不将其包含在返回的正则表达式中

  • 因此,在上述示例1中,
    警报F1234567 PKHM1 STRUC1工厂火灾123示例RD郊区M 123 J11(686833)
    返回
    123示例RD郊区

  • 在上述示例2中,警报F1234567 PKHM1 STRUC1工厂火灾示例RD郊区M 123 J11(686833)返回
    示例RD郊区

  • 在上述
    警报F1234567 PKHM1 STRUC1示例RD郊区M 123 J11(686833)的示例3中,返回示例RD郊区

正则表达式:


(?我不是VB程序员,但你是对的:这个正则表达式很可怕。那么为什么不创建一个简单的正则表达式,用
if
/
else
逻辑来解析内部结构呢?你基本上是在试图在正则表达式中插入太多东西,这显然很难处理。为什么不只是使用编程条件来逻辑地查找你需要一步一步找到什么呢?我同意@JakeGould的观点。这不是正则表达式的工作。用代码编写逻辑,然后一步一步地解决问题——这会容易得多。FWIW,这看起来像是来自澳大利亚的
000
(又名:911)系统数据格式如图所示。老实说,数据没有清晰的数据分隔符(如
)这一事实有点令人恼火。他们为什么要这样做?这里还有另一个线程,似乎与其他处于类似情况的人试图解决此问题有关。这是一个澳大利亚系统,完全令人沮丧它没有地址起始点。我想避免使用if/else逻辑,因为如果逻辑发生变化,我必须重新编程,而使用regex,我只需将字符串保存在文件中并根据需要进行更改。我认为使用regex,您可以使用(Regex1)|(Regex2)|(Regex3)例如(CNR|)([\d]+/[\d]+)|([\d]+/[\d]+)|([\d]++-[\d]+)+)|([\d]+\d]+-[\d]+)|([\d]+)。(?=SV[NCSEWV]| M | SVVB)| Regex2 | Regex3?
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)