2011-02-09 20 views
6

क्या std :: string के लिए केस असंवेदनशील खोज() विधि मौजूद है?केस असंवेदनशील स्ट्रिंग ::

+2

के अर्थ पर निर्भर करता है कि "केस संवेदी।" क्या आपके पास केवल ASCII अक्षर हैं, या क्या आपको पूर्ण यूनिकोड संयोजन की आवश्यकता है? – Philipp

उत्तर

10

आप दोनों स्ट्रिंग्स को ऊपरी-केस कर सकते हैं और नियमित खोज का उपयोग कर सकते हैं। (नोट: यदि आपके पास यूनिकोड स्ट्रिंग है तो यह दृष्टिकोण सही नहीं हो सकता है।)

बूस्ट में ifind_first भी केस-असंवेदनशील खोज के लिए है। (ध्यान दें कि यह size_t के बजाय एक रेंज देता है)।

#include <string> 
#include <boost/algorithm/string/find.hpp> 
#include <cstdio> 
#include <cctype> 

std::string upperCase(std::string input) { 
    for (std::string::iterator it = input.begin(); it != input.end(); ++ it) 
    *it = toupper(*it); 
    return input; 
} 

int main() { 
    std::string foo = "1 FoO 2 foo"; 
    std::string target = "foo"; 

    printf("string.find: %zu\n", foo.find(target)); 

    printf("string.find w/ upperCase: %zu\n", upperCase(foo).find(upperCase(target))); 

    printf("ifind_first: %zu\n", boost::algorithm::ifind_first(foo, target).begin() - foo.begin()); 

    return 0; 
} 
+1

+1 बूस्ट। स्ट्रिंग एल्गोरिदम परियोजनाओं के लिए एक पूर्व शर्त है :) –

+0

मैंने अभी ifind_first एक टेस्ट ड्राइव दिया है, और यह 2 स्ट्रिंग्स को कम केस (बूस्ट का उपयोग करके) में परिवर्तित करने और std :: string :: find का उपयोग करने से धीमा था। – goji

+0

लेकिन यह सामान्य मामले में यूनिकोड के लिए काम नहीं करेगा। "ß" और "एसएस" बराबर की तुलना करनी चाहिए, लेकिन बूस्ट स्ट्रिंग एल्गोरिदम इसे संभाल नहीं लेता है। – dalle

0
for(int i=0; i<yourString.length() 
    && tolower(yourString[i])!=yourLoweredChar; i++) 
{ 
    return i; 
} 
return -1; 

तो -1 दिया जाता है तब अपने लक्षित चार वहाँ

बाकी

नहीं है चार

2

कुछ भी कल्पना करने से पहले के पहले उभरता है देता है,

http://www.gotw.ca/gotw/029.htm

पर एक नजर है

और देखें कि कस्टम कैरेक्टर विशेषता वर्ग का उपयोग करना आप जो चाहते हैं वह नहीं है।

2
इस

मैं, क्या सुझाव दिया है | (@programmersbook के रूप में ही)

#include <iostream> 
#include <algorithm> 
#include <string> 

bool lower_test (char l, char r) { 
    return (std::tolower(l) == std::tolower(r)); 
} 

int main() 
{ 
    std::string text("foo BaR"); 
    std::string search("bar"); 

    std::string::iterator fpos = std::search(text.begin(), text.end(), search.begin(), search.end(), lower_test); 
    if (fpos != text.end()) 
    std::cout << "found at: " << std::distance(text.begin(), fpos) << std::endl; 
    return 0; 
} 
संबंधित मुद्दे