让我们澄清如下推定:
- 有三个部分的字符串。
- 第1部分始终以RR大写或小写开头,并以一个或多个小数位结尾。
- 第2节始终以S大写或小写开头,并以一位或多位小数位结尾。
- 第3节总是以C开头或以下,并以一位或多位小数位结尾。
为简单起见,以下内容就足够了。
[Rr][Rr][0-9]+[ ]+[Ss][0-9]+[ ]+[Cc][0-9]+
- [RR]指恰好一个字母R, 大写或小写。
- [0-9]意味着精确的一位小数点 数字。
- [0-9] +表示至少一个或多个 的十进制数字。
- [] +表示至少有一个或多个 空格。
但是,通常,当您使用正则表达式时,我们还会检测各个部分以利用匹配功能来帮助我们将各个部分值分配给它们各自的/单独的变量。
因此,下面的正则表达式更有帮助。
([Rr][Rr][0-9]+)[ ]+([Ss][0-9]+)[ ]+([Cc][0-9]+)
让该正则表达式应用于字符串
string inputstr = "Holy Cow RR12 S53 C21";
这是你的正则表达式匹配将让你知道:
start pos=9, end pos=21
Group(0) = Rr12 S53 C21
Group(1) = Rr12
Group(2) = S53
Group(3) = C21
有三对椭圆/圆括弧的。 每对是正则表达式编译器调用组的一部分字符串。
正则表达式编译器将调用
- 比赛整个匹配的字符串为0组
- 农村的路线为1组
- 网站作为第2组和
- 货舱中组3
当然,组1,3将遇到匹配,当且仅当组0具有匹配。
因此,你的算法会利用与下面的伪代码
string postalstr, rroute, site, compart;
if (match.group(0)!=null)
{
int start = match.start(0);
int end = match.end(0);
postalstr = inputstr.substring(start, end);
start = match.start(1);
end = match.end(1);
rroute = inputstr.substring(start, end);
start = match.start(2);
end = match.end(2);
site = inputstr.substring(start, end);
start = match.start(3);
end = match.end(3);
compart = inputstr.substring(start, end);
}
此外,你可能要进入与列的数据库表:RR,网站,舱室,但你只想要数字输入没有字母“rr”,“s”或“c”。 这将是使用嵌套分组的正则表达式。
([Rr][Rr]([0-9]+))[ ]+([Ss]([0-9]+))[ ]+([Cc]([0-9]+))
而且匹配会让你知道什么时候发生匹配组0以下:
start=9, end=21
Group(0) = Rr12 S53 C21
Group(1) = Rr12
Group(2) = 12
Group(3) = S53
Group(4) = 53
Group(5) = C21
Group(6) = 21
简单性对于正则表达式来说是件好事。 – 2009-08-26 22:26:58
肯定......我希望更多的人会分解他们的解决方案,因为我已经在上面让他们更容易理解,因为正则表达式不是最易读的语法。 – Kelsey 2009-08-26 22:36:50
@凯尔西:感谢您解释正则表达式语法 – escist 2013-03-20 13:56:10