0

我有一个令人困惑的字符串,其中通常包含某种形式的地址,在某些情况下,它是一个角落地址,因为地址在开头有一个 CNR,所以我可以使用以下正则表达式(我在 vb.网):

案例 1 Instr CNR:Regex = New Regex("( CNR )(.*?)(?=\SVSE| M | SVC | SVSW | SVNE |SVNW )", RegexOptions.RightToLeft)

在字符串的末尾通常是一个地图引用,这是最终要查找的内容,然后允许我提取地址。一旦我有了这个地址,我计划对地址进行地理编码以确定纬度和经度。

但是在某些情况下没有地址,并且字符串可能包含向我暗示地址在该点之后的短语,例如 FIRE NOW OUT JOHN ST SUBURB M 215 G2。如果是这种情况,我使用以下正则表达式:

案例 2 无 CNR:Regex = New Regex("( ([\d]+) | ([\d]+-[\d]+) | ([\d]+ - [\d]+) | CAR SMOLDERING | 输入 | 关闭 | 对面 | CNR | SPARKING | INCIC1 | INCIC3 | STRUC1 | STRUC3 | G&SC1 | G&SC3 | ALARC1 | ALARC3 | NOSTC1| NOSTC3 | RESCC1 | RESCC3 | HIARC1 | HIARC3 | 车祸 - 被抓获 | 听到爆炸声 | WASHAWAY作为事故的结果 | 入口 | 耳鼻喉科 | LHS | RHS | 电源线电弧和火花 | 风扇冒烟 | 汽车火灾 | 火警操作 | 燃气泄漏 | 燃气管道 | 现已停产 | 事故 | 吸烟 | 屋顶 | 燃气 | 需要| 火灾 | 锁在车内 | 烟雾上升 | 单车事故 | 事故 | 火灾)(.*?)(?=\SVSE| M | SVC | SVSW | SVNE | SVNW )", RegexOptions.RightToLeft)

在所有情况下,我都是从右到左工作,查看何时找到字符串的前部,然后我想从头开始直到地图参考之前。但是我的问题是,当我可能想要包含其他人时,如何使用上述(案例 2)正则表达式并查找一个短语但不包含它。例如,如果字符串有一个街道号码,那么我想在提取的字符串中包含该号码,但如果它有 REQUIRED 则我不想提取它。我举两个例子

A:A 型特殊设备所需示例 ST SUBURB M 215 G5 B:房屋火灾 123 示例 ST SUBURB M 215 G5

在情况 A 中,REQUIRED 不是地址的一部分,因此我不希望正则表达式将其包含在提取的地址中,它会输出为字符串示例 ST SUBURB。

在情况 B 中,由于存在街道地址,我不想排除它,因此提取的地址将是 123 示例 ST SUBURB。

所以问题就在上面的正则表达式中,我怎样才能提取短语之间的字符串,并在某些情况下包含该短语,而在其他情况下排除它?

对于这么大的问题,我很抱歉,我想确保我提供了足够的信息。最后一个问题是,正则表达式是否允许您计算出第一部分匹配的位置(例如字符串中的长度),例如在上面的 REQUIRED 部分中,REQUIRED 出现后是 35 个字符,并且正则表达式提取字符串示例 ST市郊。我可以让正则表达式返回第一个匹配项的位置,这样我就可以从字符串中提取其他信息(例如,从字符串的开头,直到正则表达式位置 A 提取:需要特殊设备类型 A)。

谢谢你的帮助!

4

1 回答 1

1

我得到了问题的一部分,使用 match.index 和 match.length 让我可以从那里计算出字符串实际结束的位置(例如位置),我可以做我想做的点点滴滴。

我无法解决的唯一一点是我如何使用下面的正则表达式示例并在返回的字符串中包含 CNR(例如,正则表达式匹配),如果它被发现但不包括 STREET1 或 ROAD1:

正则表达式 = 新正则表达式("( CNR ||)(.*?)(?=\SVSE| M | SVC | SVSW | SVNE |SVNW )", RegexOptions.RightToLeft)

例如,如果我的字符串是:EXAMPLE TEXT CNR 123 STREET A SUBURB M 215 G2 它将返回 CNR 123 STREET A SUBURB 但如果我的字符串是EXAMPLE TEXT STREET1 STREET A SUBURB M 215 G2 那么它将返回STREET A SUBURB\

不过我应该指出,上面示例中的 STREET1 是正则表达式开始/结束的点,但不包括在匹配中,因为 STREET A 可能是不同的短语,我不能只寻找 STREET A

谢谢!

于 2013-10-24T05:52:07.903 回答