尝试使用以下方法比较字符串:
!(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教授
答案 0 :(得分:2)
tl; dr
使用ICU library。
在自然语言字符串中,“简单方法”通常充满问题。
正如我在my answer中所指出的,@ Armando所链接的“小写转换”答案一样,如果您想正确进行此操作,则目前最好使用{ {3}},因为此时标准中没有任何内容为您提供 actual Unicode支持。
如果查看@NutCracker使用的ICU library至std::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;
}
答案 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)。