前瞻性和前瞻性,但从匹配中排除一些标准

时间:2013-10-28 02:00:39

标签: regex vb.net string

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

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

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

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

谢谢!

我在下面添加了一些额外的信息,希望对此有所帮助。这些是一些例子:

我已经制作了Italic任何匹配条件,然后我制作Bold的项目应该匹配,这些只是一些例子,但实际上正则表达式可以匹配很多不同的东西,因为地址不是总是123例st。

@@ ALERT SMPL1 F0000000 GAS PIPE LEAK MAIN HWY SUBURB SVNW 1111 A1(375302)SMPLT1 [SMPL]

@@ ALERT F0000000 SMPL1 STRUC1烟雾报警操作和烟雾 CNR 样本ST /示例ST SUBURB SVNE 1111 D7

@@ ALERT SMPL1 F0000000 车辆事故 - POSS人被劫持 主要人员 SVNW 1111 A1(375302)SMPLT1 [SMPL]

@@ ALERT F0000000 SMPL1 STRUC1 气体瓶爆炸 样品ST /示例ST SUBURB 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 SUBURB / ROAD ST M 000 K3(000000)

@@ ALERT F000000 BELM4 STRUC1 FIRE JACARANDA ST SUBURB / ROAD ST M 000 K3(000000)

@@ ALERT F000000 BELM4 STRUC1 EXPLOSION 123 JACARANDA ST SUBURB / ROAD ST M 000 K3(000000)

@@ ALERT F000000 BELM4未定义的火灾JACARANDA ST SUBURB / ROAD ST M 000 K3(000000)

2 个答案:

答案 0 :(得分:0)

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

(?<=GAS PIPE LEAK).*?(?=SVN[EW])|(CNR|STREET A).*?(?=SVN[EW])

答案 1 :(得分: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与单词边界匹配,这意味着它只会在'单词'的开头或结尾处匹配(单词是字母数字并包含下划线)]