比较字符串不区分大小写的简单方法是什么?

时间:2017-02-16 09:28:46

标签: c++ string algorithm vector

尝试使用以下方法比较字符串:

!(stringvector[i]).compare(vector[j][k]) 

仅适用于

的某些条目
vector[j][k] 

- 即区分大小写的字符串匹配。

如何从此功能获得不区分大小写的匹配?

以下是我正在处理的一些代码

#include <iostream>
#include <vector>
#include <string>

using namespace std; //poor form


vector<string> stringvector = {"Yo", "YO", "babbybabby"};
vector<string> vec1 = {"yo", "Yo" , "these"};
vector<string> vec2 = {"these", "checked" , "too" , "Yo", "babbybabby"};
vector<vector<string>> vvs = {vec1, vec2};

for (int v = 0; v < vvs.size(); v++) //first index of vector
{
    for(int s = 0; s < vvs[v].size(); s++) //second index of vector
        {

            for(int w = 0; w < stringvector.size(); w++)
            {
                if (stringvector[w] == vvs[v][s])
                {cout << "******FOUND******";}
            }

    }
}

对于不区分大小写的匹配,这不会打印出FOUND。

Stringvector [w] == vvs [v] [s]不会进行不区分大小写的比较,有没有办法轻松添加此功能?

- D教授

3 个答案:

答案 0 :(得分:2)

tl; dr

使用ICU library


在自然语言字符串中,“简单方法”通常充满问题。

正如我在my answer中所指出的,@ Armando所链接的“小写转换”答案一样,如果您想正确进行此操作,则目前最好使用{ {3}},因为此时标准中没有任何内容为您提供 actual Unicode支持。

如果查看@NutCracker使用的ICU librarystd::tolower,您会发现...

此功能只能执行1:1字符映射,例如希腊大写字母“Σ”有两种小写形式,具体取决于单词中的位置:“σ”和“ς”。在这种情况下,无法使用对std :: tolower的调用来获取正确的小写形式。

如果您想正确正确地执行此操作,则需要完整的Unicode支持,这意味着ICU库,直到C ++标准的某些更高版本实际上将其引入了。标准库。

使用the docs(一开始可能很笨拙)来存储语言字符串使您可以访问icu::UnicodeString,这会进行 proper 不区分大小写的比较

答案 1 :(得分:1)

您可以为此目的实现一个功能,例如:

bool areEqualsCI(const string &x1, const string &x2){
    if(x1.size() != x2.size()) return false;
    for(unsigned int i=0; i<x2.size(); ++i) 
        if(tolower((unsigned char)x1[i]) != tolower((unsigned char)x2[i])) return false;
    return true;
}

我建议看这篇帖子How to convert std::string to lower case?

答案 2 :(得分:0)

首先,我给自己一些自由,可以稍微修改一下代码。为此,我用range-based for loops替换了普通的for循环。此外,我已经更改了您的变量名称。但是,由于我不知道代码的目的,因此它们还不是完美的。但是,这是一个重构的代码:

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> vec1 = { "Yo", "YO", "babbybabby" };
    std::vector<std::string> vec2 = { "yo", "Yo" , "these" };
    std::vector<std::string> vec3 = { "these", "checked", "too", "Yo", "babbybabby" };
    std::vector<std::vector<std::string>> vec2_vec3 = { vec2, vec3 };

    for (auto const& i : vec2_vec3) {
        for (auto const& j : i) {
            for (auto const& k : vec1) {
                if (k == j) {
                    std::cout << k << " == " << j << std::endl;
                }
            }
        }
    }

    return 0;
}

现在,如果要不区分大小写地比较字符串,并且可以访问Boost库,则可以按以下方式使用boost::iequals

#include <boost/algorithm/string.hpp>

std::string str1 = "yo";
std::string str2 = "YO";

if (boost::iequals(str1, str2)) {
    // identical strings
}

另一方面,如果您无权访问Boost库,则可以使用STL算法(需要C ++ 14)来制作自己的iequals函数:

bool iequals(const string& a, const string& b) {
    return std::equal(str1.begin(), str1.end(),
                      str2.begin(), str2.end(),
                      [](char a, char b) {
                          return std::tolower(a, std::locale()) == std::tolower(b, std::locale());
                      });
}

std::string str1 = "yo";
std::string str2 = "YO";

if (iequals(str1, str2)) {
    // identical strings
}

请注意,这仅适用于单字节字符集(SBCS)。