让我们澄清以下假设:
- 字符串分为三个部分。
- 第 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 组。
当且仅当第 0 组有匹配时,第 1、2 和 3 组自然会遇到匹配。
因此,您的算法将使用以下伪代码利用它
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、site、compart,但您只想输入不带字母“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