2013-02-18 135 views
1

我想一起使用拆分和正则表达式来分隔一行中的特殊代码。 这是我的路线:VB.NET中的正则表达式拆分

14S15T3C16W17A0-20m0-7T

现在我想每个项目分离出来,并且项目可能是如14S,15T,7T,等等 它由数字随机长度和一个单一的字母的该数字后:

例如为:125125125125125X或11T。

还有一个例外是0-,它们将保持原样,并且必须分离出来。

我做了一个正则表达式自己:

Dim digits() As String = Regex.Split(line, "([0-9][A-Z]|0-)") 

但问题是,只需要组合的1位数字,例如,如果线路11T2B13D,它会像这样它分开:1 ,1T,2B,1,3D

我怎样才能解决这个问题?

回答

2

由于会有重圆每个令牌单个字母字符或斜线-(对于0-的情况下),可以使用与Regex.Split的regex拆分:

(?<=[-a-zA-Z]) 

(?<=pattern)零宽度(文本未被占用)正向后视,并且如果当前位置之前的文本与pattern内部匹配,则匹配。

上述正则表达式仅仅检查的当前位置之前的字符是字母(大写或小写)a-zA-Z或破折号-,和分割在当前位置。


或者,你可以用这个表达式与Regex.Matches做到这一点:

[0-9]+[A-Za-z]|0- 

由于数量可以是任意长的,你需要的1个或多个量词+。其余的应该是清楚的,因为它非常接近你所尝试过的。


两种方法应(根据你的规范)具有用于有效的输入相同的效果。但是,当输入无效时,Regex.Split方法会产生无效标记,而Regex.Matches方法产生有效标记(它将跳过无效字符/序列)。

0

如果你的目标是11T2B13D分成11T 2B 13D,那么你就需要改变你的正则表达式,这是1个或多个数字。所以使用[0-9] + [A-Z] | 0-,如果+运算符(意​​思是一个或多个)不存在,请改为[0-9] [0-9] [A-Z] | 0-。 (表示零或更多)。