2

我正在使用正则表达式来提取地址。我想做的是能够在我的代码块中使用一些正则表达式来提取地址,但在某些情况下,在返回的匹配项(例如 STREET A、CNR)和其他情况采用两点之间的所有文本,但不包括返回匹配中的点之一。

我希望有人可以帮助我构建一个正则表达式字符串,它将返回字符串中两个定义点之间的所有内容。问题是有时匹配应该包括来自正则表达式的短语(例如 CNR),而其他时候不同的短语不应该包含在匹配中(例如示例文本)。

这是一个正则表达式示例,在这种情况下,如果 STREET A 存在,它将在匹配中包含它: Regex = New Regex("( CNR| STREET A|EXAMPLE TEXT)(.*?)(?=\SVSE| M | SVC | SVSW | SVNE |SVNW )", RegexOptions.RightToLeft)

如何在上述正则表达式中使用 STREET A (或其他短语)作为标记来返回正则表达式匹配,但实际上不将其包含在匹配本身中?

谢谢!

我在下面提供了一些额外的信息,希望能有所帮助。这些是一些例子:

我已经将斜体作为匹配标准的任何内容,然后我制作的粗体项目是应该匹配的,这些只是几个例子,但实际上正则表达式可以匹配很多不同的东西,因为地址并不总是 123 例子英石。

@@ALERT SMPL1 F0000000燃气管道泄漏 主高速公路郊区 SVNW 1111 A1 (375302) SMPLT1 [SMPL]

@@ALERT F0000000 SMPL1 STRUC1 烟雾报警器操作和烟雾CNR示例 ST/示例 ST 郊区SVNE 1111 D7

@@ALERT SMPL1 F0000000 车祸- 被抓获的 主要高速公路郊区 SVNW 1111 A1 (375302) SMPLT1 [SMPL]

@@ALERT F0000000 SMPL1 STRUC1气瓶爆炸 示例 ST/示例 ST 郊区 SVNE 1111 D7

- - 更多信息 - -

这就是正则表达式当前(并且有效)的内容,但是我在设法在一开始就排除多个匹配项时遇到了麻烦:

(CNR|(([\d]+/[\d]+)|([\d]+ / [\d]+)|([\d]+-[\d]+)|([\d]+ - [\d]+)|( [\d]+ ))).*?(?=SV[NCSEW]| M )|(?<=GAS PIPE LEAK).*?(?=SV[NCSEW]| M )

这就是我想尝试并实现的目标:(但无法正常工作)

(CNR|(([\d]+/[\d]+)|([\d]+ / [\d]+)|([\d]+-[\d]+)|([\d]+ - [\d]+)|( [\d]+ ))).*?(?=SV[NCSEW]| M )|(?<=(GAS PIPE LEAK|FIRE ALARM|SMOKE ALARMS|FIRE|)).*?(?=SV[NCSEW]| M )

以下是一些示例字符串:

@@ALERT F000000 BELM4 STRUC1 激活烟雾报警器 JACARANDA ST 郊区/ROAD ST M 000 K3 (000000)

@@ALERT F000000 BELM4 STRUC1 火蓝花楹 ST 郊区 /ROAD ST M 000 K3 (000000)

@@ALERT F000000 BELM4 STRUC1 爆炸 123 JACARANDA ST 郊区 /ROAD ST M 000 K3 (000000)

@@ALERT F000000 BELM4 UNDEFINED FIRE JACARANDA ST 郊区/ROAD ST M 000 K3 (000000)

4

2 回答 2

0

您可以使用前缀和后缀匹配表达式,然后将结果与其他匹配项一起使用

(?<=GAS PIPE LEAK).*?(?=SVN[EW])|(CNR|STREET A).*?(?=SVN[EW])
于 2013-10-28T11:30:33.473 回答
0

你可以使用类似的东西:

((?<=(?:GAS PIPE LEAK|CAR ACCIDENT - POSS PERSON TRAPPED|GAS BOTTLE EXPLOSION) )|CNR).*?(?= [A-Z]+ [0-9]+)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^^
                                          1                                        2

您可以在其中看到第一部分是不匹配的部分,第二部分是匹配的部分。

请注意,如果地址前有不同的短语变体,则正则表达式不是很实用。如果您可以识别一些模式,那将是正则表达式更合适的工具:)


编辑:更新后,您可能会尝试这样的事情:

((?<=(?:GAS PIPE LEAK|FIRE|RHS|ROOF|TRAPPED|EXPLOSION|ALARMS) )|CNR).*?(?= SV[NCSEW]| M\b)

我在regexhero.net上对其进行了测试,但由于我无法在不支付帐户费用的情况下创建永久链接,因此以下是您的 8 个示例输入的结果:

MAIN HWY SUBURB
CNR SAMPLE ST/EXAMPLE ST SUBURB
MAIN HWY SUBURB
SAMPLE ST/EXAMPLE ST SUBURB
JACARANDA ST SUBURB /ROAD ST
JACARANDA ST SUBURB /ROAD ST
123 JACARANDA ST SUBURB /ROAD ST
JACARANDA ST SUBURB /ROAD ST

否则,您当前的正则表达式对于所有嵌套的捕获组都不是那么可读。您可能会考虑将一些转换为非捕获组,并使用开头的数字重新组合一些选项:

(?:CNR|\b\d+(?:\s?[/-]\s?\d+)?\b).*?(?= SV[NCSEW]| M\b)|(?<=(?:GAS PIPE LEAK|FIRE ALARM|SMOKE ALARMS|FIRE|TRAPPED|EXPLOSION) ).*?(?= SV[NCSEW]| M\b)

我在前瞻中添加了更多选项,并在前瞻|结束时移除了唯一的管道。

[我\b通常也使用而不是空格。\b匹配单词边界,这意味着它将仅匹配“单词”的开头或结尾(单词是字母数字并包括下划线)]

于 2013-10-28T12:26:54.310 回答