2010-09-15 87 views
0

在接受採訪時我問到了這個問題,我的解決方案有點吸引人,所以我想知道是否有人可以做得更好。解析URL字符串以刪除不需要的東西(C++)

鑑於這種形式的URL字符串:

http://www.foo.com?key1=value1&key2=value2&key3=value3,並給予重點

我想創建一個函數,它接受一個鍵值,並返回原始字符串沒有密鑰和值。

例子:

輸入:

http://www.foo.com?key1=value1&key2=value2&key3=value3 
remove: key2 and its value 

輸出:

http://www.foo.com?key1=value1&key3=value3 

我的解決辦法是這樣的:

void parseURL(string str, string key) 
{ 
    int i; 
    i = str.find_first_of("?"); 

    string s = str.substr(i); 
    int start = s.find(key); 
    int end = 0; 
    if (start !=string::npos) 
     end = s.find_first_of("&", start); 

    string news = str.substr(0, i) + s.substr(0, start-1) + s.substr(end); 

    cout << news; 
} 

但它的醜陋,這將失敗一對 的測試用例。我知道有人有更聰明的方式來做到這一點。任何人?

回答

1

我(如果你在你的最近編譯器的C++ 0x實現TR1標準regex庫中的std ::正則表達式)使用的std :: TR1 ::正則表達式會肯定嘗試過,但我會在我猜測的正則表達式語法上花費了太多時間。

+1

使用正則表達式是我的第一種方法,無論是在真實代碼還是在面試中。如果這在某種程度上是不可接受的,我會按照泰勒的建議來處理這個字符串。 – 2010-09-15 22:11:51

2

您的解決方案最大的概念性問題是假設他們給出的關鍵字不會在URL的查詢部分的任何其他位置出現,無論是作爲值的一部分還是作爲另一個關鍵字的一部分。換句話說,給定輸入http://www.example.com?keystone=value1&key=value2,尋找key將意外刪除keystone=value1。或者給定輸入http://www.example.com?key1=key2&key2=value2,尋找key2將返回http://www.example.com?key1=&key2=value2,這又不是你想要的。

假設你不能/不想使用正則表達式庫對於這一點,你可以做出最好的改進是提取每個按鍵的全部(通過提取之間一切?&和隨後= ),直到其中一個匹配您正在查找的密鑰,然後像以前一樣刪除。

根據問題中所做的假設,您可能需要考慮如何解析URL編碼的字符(例如,查找「多字鍵」應與multi%20word%20key匹配)。

+0

D'OH!是的。我知道我的解決方案被吸引。 – eviljack 2010-09-15 21:53:28

0

聽起來像它是乞求regexps。在Perl中它可能類似於

$url =~ s/^((.*)\?(.*))[\?&]$key=[^&]*&?(.*)$/$1$4 

即匹配「?」之前的內容它引入了參數,匹配參數之前的密鑰,還有鍵(它必須位於「?」或「&」和「=」之間,因此不能在字符串的另一部分中獲得部分匹配)及其參數,然後匹配什麼(如果有的話)之後。

你可以相當直接地將這些正則表達式轉換成.NET,但我在vi和Perl中學到了它們,所以這就是我從哪裏開始的。

+0

-1:問題在於C++。 – Jagannath 2010-09-16 04:37:15

+0

@Jagannath - 真夠的!你仍然可以找到用於C++的正則表達式解析器 - 如果還有更多需要處理的情況需要付出努力。 – AAT 2010-09-29 22:30:39