字符串与特殊字符的匹配

时间:2019-01-31 13:44:55

标签: c++ string

我需要生成一个可以匹配另一个包含特殊字符的字符串。我写了我认为是一种简单的方法,但到目前为止,没有任何事情能使我获得成功的比赛。

我知道c ++中的特殊字符以“ \”开头。例如,单引号将写为“ \'”。

string json_string(const string& incoming_str)
{
    string str = "\\\"" + incoming_str + "\\\"";
    return str;
}

这是我必须比较的字符串:

bool comp = json_string("hello world") == "\"hello world\"";

我可以在cout流中看到,实际上我正在根据需要生成字符串,但是比较仍然给出了false值。

我想念什么?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

一种方法是过滤一个字符串并比较此过滤后的字符串。例如:

#include <iostream>
#include <algorithm>

using namespace std;

std::string filterBy(std::string unfiltered, std::string specialChars)
{
    std::string filtered;

    std::copy_if(unfiltered.begin(), unfiltered.end(),
              std::back_inserter(filtered), [&specialChars](char c){return specialChars.find(c) == -1;});

    return filtered;
}

int main() {
    std::string specialChars = "\"";
    std::string string1 = "test";
    std::string string2 = "\"test\"";

    std::cout << (string1 == filterBy(string2, specialChars) ? "match" : "no match");

    return 0;
}

输出为match。如果您向specialChars添加任意数量的字符,则此代码也适用。

如果两个字符串都包含特殊字符,则还可以通过string1函数放置filterBy。然后,类似:

"\"hello \" world \"" == "\"hello world "

也将匹配。

如果比较对于性能至关重要,则您可能还会使用两个迭代器进行比较,从而获得log(N + M)的比较复杂度,其中N和M分别是两个字符串的大小。

答案 1 :(得分:0)

bool comp = json_string("hello world") == "\"hello world\"";

这肯定会产生错误。您正在通过\"hello world\"创建字符串json_string("hello world"),但将其与"hello world"

进行比较

问题在这里:

 string str = "\\\"" + incoming_str + "\\\"";

在str的第一个字符串文字中,假定被视为转义字符的第一个字符反斜杠实际上并没有被当作转义字符,而是在字符串文字中只是反斜杠。您在最后一个字符串文字中执行相同的操作。

执行此操作

string str = "\"" + incoming_str + "\"";

答案 2 :(得分:0)

在C ++字符串中,文字用引号分隔。

然后出现问题:如何定义本身包含引号的字符串文字?在Python(供比较)中,这很容易实现(但此方法没有引起其他缺点,在这里不感兴趣):'a string with " (quote)'

C ++没有这种替代的字符串表示形式 1 ,相反,您只能使用转义序列(在Python中也可用-仅出于完整性考虑...):在字符串中(或字符)文字(但无处不在!),序列\"将在结果字符串中替换为单引号。

因此"\"hello world\""被定义为字符数组将是:

{ '"', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '"', 0 };

请注意,现在不需要转义字符...

json_string函数中,您附加了其他反斜杠,但是:

"\\\""
{ '\', '"', 0 }
//^^^

请注意,我写'\'只是为了说明!您将如何定义单引号?通过再次逃跑! '\'' –但现在您也需要转义转义字符,因此此处实际上需要将单个反斜杠写为'\\'(相比之下,您不必在转义中转义单引号。字符串文字:"i am 'singly quoted'" –就像您不必在字符文字中转义双引号一样。

由于JSON也对字符串使用双引号,因此您很可能希望更改函数:

return "\"" + incoming_str + "\"";

或更简单:

return '"' + incoming_str + '"';

现在

json_string("hello world") == "\"hello world\""

将产生真实的...

1 旁注(同时从答案中被盗):自C ++ 11起,也有raw string literals。使用这些,您也不必逃脱。