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



尝试使用:

来比较字符串
!(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******";}
            }
    }
}

这没有打印出针对情况不敏感的匹配。

stringvector [w] == vvs [v] [s]不能对情况不敏感,有没有办法可以轻松添加此功能?

- 教授D

tl; dr

使用ICU库。


"简单的方式",当涉及自然语言字符串时,通常充满了问题。

正如我在答案中指出的"小写转换"答案@armando链接到的答案,如果您想实际执行此操作 right ,您目前最好使用ICU库,因为此时,标准中没有任何东西可以为您提供实际 Unicode支持。

如果您查看@NutCracker使用的std::tolower的文档,您会发现...

只能通过此功能执行1:1字符映射,例如希腊大写字母"σ"具有两个小写形式,具体取决于一个单词的位置:'σ'和'ς。在这种情况下,无法使用对STD :: Tolower的呼叫来获取正确的小写形式。

如果您想正确执行此操作,您需要完整的Unicode支持,这意味着ICU库,直到C 标准的后来进行了一些修订,实际上将其介绍给该库标准库。

使用 icu::UnicodeString-起初可能笨拙 - 存储您的语言字符串使您可以访问caseCompare(),它可以进行适当的 case-case-dimentimentiment。

您可以为此目的实现一个函数,例如:

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;
}

我建议您查看这篇文章如何将std ::字符串转换为较低的情况?

首先,我给了自己一些自由,可以稍微提高您的代码。为此,我用基于范围的循环代替了普通的循环。此外,我更改了您的变量名称。尽管我不知道代码的目的是什么,但它们还不是完美。但是,这是一个重构的代码:

#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
}

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

最新更新