讓我們澄清如下推定:
- 有三個部分的字符串。
- 第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