2013-10-21 50 views
0

我有一个令人困惑的字符串,通常有一些地址的形式,在某些情况下,它是一个角落地址很容易,因为地址有一个CNR在开始,所以我可以使用以下正则表达式(我正在vb.net工作):字符串和位置之间的正则表达式

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

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

但是在某些情况下没有地址,并且该字符串可能包含一些短语,这些短语暗示地址在该点之后,例如现在熄灭约翰ST SUBURB M 215 G2。如果是这种情况,我使用下面的正则表达式:

Case 2 No CNR:Regex = New Regex(“(([\ d] +)|([\ d] + - [\ d] +)|( [| d] + - [\ d] +)| CAR SMOLDERING | INPUT | OFF | OPPOSITE | CNR | SPARK | INCIC1 | INCIC3 | STRUC1 | STRUC3 | G & SC1 | G & SC3 | ALARC1 | ALARC3 | NOSTC1 | NOSTC3 | RESCC1 | RESCC3 | HIARC1 | HIARC3 |车祸 - 受伤人员|爆炸声|事故原因|事故处理|入口| ENT | LHS | RHS |电源线ARCING AND SPARKING |烟囱冒烟|汽车火警|火警警报操作| |气体泄漏|气管|现在熄灭|事故|吸烟|屋顶|气体|要求|火灾|汽车上锁|烟雾崛起|单车事故|事故|火灾(。*?)(?= \ SVSE | M | SVC | SVSW | SVNE | SVNW)“,RegexOptions.RightToLeft)

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

答:特别器具TYPE-A REQUIRED例ST郊区中号215 G5 B:住宅火灾123实施例ST郊区中号215 G5

在情况A中,需要的是不是地址的一部分,所以我不希望正则表达式将它包含在提取的地址中,并且它将以字符串形式输出。例子ST SUBURB。

在案例B中,由于存在街道地址,我不想排除这一点,所以提取的地址将为123 EXAMPLE ST SUBURB。

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

对不起,我想确保我提供了足够的信息。 最后一个问题是,regex是否允许你计算第一部分匹配的位置(例如字符串的长度),例如在上面的REQUIRED部分中,在REQUIRED出现后是35个字符,并且正则表达式提取字符串EXAMPLE ST SUBURB。我可以让正则表达式返回第一个匹配的位置,所以我可以从字符串中提取附加信息(例如,从字符串的开头,直到正则表达式位置A提取:特殊电器类型-A要求)。

感谢您的帮助!

回答

1

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

我不能工作了,唯一的一点就是我可以使用正则表达式例如像下面的,包括中国北车在返回的字符串(如正则表达式匹配),如果它被发现,但不包括STREET1或ROAD1:

Regex = New Regex(“(CNR ||)(。*?)(?= \ SVSE | M | SVC | SVSW | SVNE | SVNW)”,RegexOptions.RightToLeft)

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

I应该指出,在上面的例子中,STREET1是正则表达式开始/结束的点,但是没有包含在匹配中,因为STREET A可能是一个不同的短语,我不能仅仅寻找STREET A

谢谢!

相关问题