2010-09-15 95 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