我有一个令人困惑的字符串,其中通常包含某种形式的地址,在某些情况下,它是一个角落地址,因为地址在开头有一个 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)。
谢谢你的帮助!