我有一个令人困惑的字符串,通常在其中有某种形式的地址,在某些情况下,它是一个角落地址很容易,因为地址在开始时有一个CNR所以我可以使用以下正则表达式(我工作在vb.net中):
案例1 Instr CNR:正则表达式=新正则表达式("(CNR)(。*?)(?= \ SVSE | M | SVC | SVSW | SVNE | SVNW)",RegexOptions.RightToLeft)
在字符串的末尾通常是一个地图引用,这是结尾寻找的内容然后允许我提取地址。一旦我有了这个地址,我打算对地址进行地理编码以确定纬度和经度。
然而,在某些情况下,没有地址,并且字符串可能包含向我建议地址在该点之后的短语,例如FIRE NOW OUT JOHN ST SUBURB M 215 G2。如果是这种情况,我使用以下正则表达式:
案例2没有CNR:正则表达式=新正则表达式("(([\ d] +)|([\ d] + - [\ d] +)|([\ d] + - [\ d \ ] +)| CAR SMOLDERING | INPUT | OFF | OPPOSITE | CNR | SPARKING | INCIC1 | INCIC3 | STRUC1 | STRUC3 | G& SC1 | G& SC3 | ALARC1 | ALARC3 | NOSTC1 | NOSTC3 | RESCC1 | RESCC3 | HIARC1 | HIARC3 | CAR事故 - POSS人员陷入困境|爆炸事件|事故导致的WASHAWAY | ENTRANCE | ENT | LHS | RHS |电力线路电弧和火花|烟雾发生|汽车火灾|火灾报警操作|气体泄漏|气体管道| NOW OUT |事故|吸烟|屋顶|气体|必需|火灾|锁定汽车|烟雾上升|单车事故|事故|火灾)(。*?)(?= \ SVSE | M | SVC | SVSW | SVNE | SVNW)& #34;,RegexOptions.RightToLeft)
在所有情况下,我都是从右到左工作,希望看到找到字符串前部的时间,然后我想从头开始直到地图参考之前。但是我的问题是如何使用上面的(案例2)正则表达式并查找一个短语但不包括它,当我可能想要包含其他人时。例如,如果字符串有一个街道编号,那么我想在提取的字符串中包含该编号,但如果它已经是必需的,那么我不想提取它。我将举两个例子
A:特殊设备类型 - 必需示例ST SUBURB M 215 G5 B:房屋火灾123示例ST SUBURB M 215 G5
如果A,REQUIRED不是地址的一部分,那么我不希望正则表达式将其包含在提取的地址中,并且它将输出为字符串EXAMPLE ST SUBURB。
如果是B,由于街道地址存在,我不想排除它,因此提取的地址将是123例子ST SUBURB。
所以问题出在上面的正则表达式中,如何在短语之间提取字符串,并在某些情况下包含短语,并将其排除在其他情况下?
对于这么大的问题,我很抱歉,我想确保提供足够的信息。 最后一个问题是,正则表达式是否允许您计算出第一部分匹配的位置(例如字符串中的长度),例如在上面的REQUIRED部分中,在REQUIRED出现后它是35个字符,并且正则表达式提取字符串EXAMPLE ST市郊。我可以让正则表达式返回第一个匹配的位置,因此我可以从字符串中提取其他信息(例如从字符串的开头,直到正则表达式位置A提取:特殊设备类型 - 必需)。
感谢您的帮助!
答案 0 :(得分:1)
我得到了问题的一部分,使用match.index和match.length允许我从那里找出字符串实际结束的位置(例如位置),我可以做我想要的点点滴滴。
我无法解决的唯一问题是如何使用如下所示的正则表达式示例并在返回的字符串中包含CNR(例如正则表达式匹配)如果找到它但不包括STREET1或ROAD1:
Regex = New Regex(“(CNR ||)(。*?)(?= \ SVSE | M | SVC | SVSW | SVNE | SVNW)”,RegexOptions.RightToLeft)
例如,如果我的字符串是:示例文本CNR 123 STREET A SUBURB M 215 G2它将返回CNR 123 STREET A SUBURB但是如果我的字符串是示例文本STREET1 STREET A SUBURB M 215 G2那么它将返回STREET A SUBURB \
我应该指出,上面例子中的STREET1是正则表达式开始/结束的点,但是不包括在匹配中,因为STREET A可能是一个不同的短语,我不能只是寻找STREET A
谢谢!