趣味程式設計 從字串中提取資訊

2021-07-09 02:15:00 字數 2109 閱讀 4962

字串解析是程式設計師工作中非常重要的一部分,也是非常考驗程式設計能力的工作。基本上我在面試程式設計師的時候,一定會出一道程式設計題目作為考察的一方面,而這道題目有很大的可能性是做字串的解析。例如,給出乙個模式規則,要求寫程式判斷某個字串是否符合特定格式。例如,要求將bb code轉化為html。而現在這個趣味程式設計題,來自於我目前正在進行的專案。因此從實用角度來說,也有一定現實意義。

這個標題基本上沒有包含多少資訊,不過我也實在不知道該如何描述這個問題。這個任務是要從乙個字串中提取一些資訊,於是我們先來定義概念:

首先是「token」,token是最小的資訊單元,我們可以把它當作是乙個字串來處理。而多個token則組成了乙個token group,token group之間的各token使用「-」進行分割。例如,以下便定義乙個了token group:

jeffz-hello-world
乙個token group可以用乙個字串陣列或列表來表示,例如上面的字串則表示乙個包含三個token的token group,分別是jeffz,hello和world。多個token group則可以組成一整個字串資訊,我們把它稱為text。乙個text中的各個token group使用「--」進行分割,例如:

group1-hello--group2-world
乙個text可以認為是token group的陣列或列表。因此,最終從乙個text中提取到的資訊,則可以用乙個字串陣列的列表來表示。例如,以上的text的資訊其實就類似於:

new list, new string  }
不過您想到這樣乙個問題:「-」是作為分割符使用的,但如果乙個token中本身需要包含「-」又該如何呢?於是,我們又引入了單引號,被一組單引號包裹的token,其中所有的「-」被當作是普通的字元處理,不作為分隔符。例如:

jeffz-'hello-world'
這樣乙個字串所表示的text,它包含乙個token group,其中有兩個token:

new list }
但是,既然單引號也有特殊含義了,那麼乙個token中又如何表示乙個單引號呢?於是乎,我們再定義乙個規則,如果乙個token中需要包含單引號的話,我們需要使用單引號來包含這個token,並且token中的單引號變成兩個單引號。例如:

jeffz-'hello''''world'
它所表示的資料即為:

new list }
text中包含四個單引號,但是表示的資料中只有兩個單引號,這就是我們的「轉義」規則。還有值得注意的是,如果token中需要包含單引號或「-」,那麼這個token在表示的時候一定需要用一對單引號包裹起來——這也是為了「簡化規則」。

這次的「趣味程式設計」便是希望寫乙個方法,從text中提取出「資料」,也就是乙個list,我們假設所有的輸入都是正確的。

那麼,這個規則又有什麼含義呢?在我的專案中,這個字串被當作是產品查詢頁面的url,表示的自然是產品的查詢條件。由於查詢條件非常的豐富,還會根據不同的分類有所改變,因此在url中表現查詢條件非常的麻煩。例如,**的查詢頁面url便是這樣的:

但是,這個url對於某個人來說幾乎沒有任何可讀性。普通使用者對此的關注度自然小很多,但是這樣的url也會給開發人員的工作造成不小的麻煩。在我看來,有乙個相對易讀的規則還是很重要的。此外,據說url中的關鍵字對於seo也很有幫助(當然這點我不確定)。因此,我們設計了本文這種「自洽」的資料表示方式。如果您足夠「敏感」的話,會發現作為特殊字元的單引號或是「-」符號,它們在url上是不需要轉義的——這也是我們為它們賦予特殊含義的原因。

於是現在,我們便可以使用這樣的url字串來表示乙個查詢條件了:

cpu-3.0g--color-red-green-black--price-5000-8000--weight-'3-'--keywords-'levi''s'
這個text拆開後的得到的資料便是:

new list,

new string ,

new string ,

new string ,

new string ,

}

於是這個查詢條件便是:cpu為3.0g,顏色為紅、綠或黑,**在5000到8000,重量在3千克內,幷包含「levi's」關鍵字的……筆記本?

您也來試試看吧!(參***:上、下)

from: 

趣味程式設計 從字串中提取資訊(C語言版本)

大概就是如下乙個字串 cpu 3.0g color red green black price 5000 8000 weight 3 keywords levi s 要拆分成如下格式,原題目要求位址如下 老趙的c 語言版本如下 最近學c語言,我翻譯成c語言的了,在dev c 4.9.9.2編譯執行通...

從字串中提取數字

下面程式將字串中的連續數字提取出來,並存放到一維陣列中。比如說乙個字串 a284twx234 je3432 把 284 234 3432 這3個連續數字提取出來,分別存放到a 0 a 1 a 2 中。include include include int main buf i 0 sscanf bu...

從字串中提取整數

首先說一下我要做的事情 從乙個txt檔案中 存著乙個矩陣 從這個檔案中提取出這個檔案中的整數。矩陣 1 2 3 4 5 6 7 8 0 1 8 7 3 8 2 9 之前用的函式是fgets char fgets char s,int n,file stream 引數 s 字元型指標,指向儲存讀入資料...