मैं c ++ में regex का उपयोग करने की कोशिश कर रहा हूं ताकि यह निर्धारित किया जा सके कि एस्ट्रिंग में केवल बाइनरी (1/0) होता है। मैंने इसे जावा में .matches ("[01] +") काफी सरलता से प्रयोग किया। हालाँकि अब जब मैं "c ++ I" के समसामयिक मुद्दों को बदलने की कोशिश कर रहा हूँ
मैं दृश्य स्टूडियो 2010 का उपयोग कर रहा हूं और यह त्रुटि प्राप्त करता हूं
त्रुटि: अतिभारित फ़ंक्शन "regex_match" का कोई उदाहरण तर्क सूची से मेल नहीं खाता
मेरा कोड यहाँ है
#include <iostream>
#include <string>
#include <regex>
using namespace std;
// ...
string bFU;
do
{
cout << "nEnter a binary value containing up to 16 digits: ";
getline (cin, bFU);
if (!regex_match(bFU, "[01]+") || bFU.length()>16)
{
cout << "nError: Invalid binary value.nTry again.n"
"Press Enter to continue ... ";
bFU = "a";
cin.ignore(80, "n");
}
} while (!regex_match(bFU, "[01]+"));
दृश्य स्टूडियो में मुझे वह त्रुटि मिलती है जब मैं regex_match पर माउस करता हूं जो लाल रेखांकित होता है
मदद के लिए धन्यवाद, मैं दर्जनों वेबसाइटों के माध्यम से गुगली कर रहा हूँ और यह समस्या को और भी अधिक अस्पष्ट बना रहा है
उत्तर:
उत्तर № 1 के लिए 1regex_match
लिया जाता है एक std::basic_regex
रेगेक्स के लिए एक स्ट्रिंग के बजाय।
देख यहाँ उपलब्ध ओवरलोड और उपयोग के उदाहरणों के लिए।
जवाब के लिए 0 № 2
अगर आप चेक करते हैं तो का संदर्भ regex_match
आप देखेंगे कि जो पैरामीटर आप पास करते हैं, वे उस फ़ंक्शन से मेल नहीं खाते हैं जो वास्तव में लेता है।
उपयोग करने के तरीके को देखने के लिए संदर्भ में उदाहरण देखें regex_match
समारोह।
जवाब के लिए 0 № 3
यहां बताया गया है कि मैं आपका कार्यक्रम कैसे लिखूंगा:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
const basic_regex<char> binmatcher("[01]+");
string bFU;
for (bool matched = false; !matched;)
{
cout << "nEnter a binary value containing up to 16 digits: ";
getline(cin, bFU);
matched = regex_match(bFU, binmatcher);
if (!matched || bFU.length()>16)
{
cout << "nError: Invalid binary value.nTry again.n"
"Press Enter to continue ... ";
cin.ignore(80, "n");
}
}
cout << "The binary value I found acceptable was: " << bFU << "n";
return 0;
}
दुर्भाग्य से, मैं इसे वास्तव में परीक्षण कर सकता हूं क्योंकि रेगेक्स समर्थन जी ++ 4.7.2 में टूट गया है।
जैसा कि आपने देखा, regex_match
एक तार नहीं लेता है। और न ही होना चाहिए। एक नियमित अभिव्यक्ति का संकलन आमतौर पर एक का उपयोग करने की तुलना में काफी अधिक गहन गणना है।
पर्ल इतना तेज है क्योंकि यह नियमित रूप से संकलित करता हैपहली बार एक बार अभिव्यक्त होने के बाद, यह एक ऐसा कदम है जो आपसे छिपा हुआ है और कुछ स्थितियों में आश्चर्यजनक परिणाम देता है (जैसे कि जब आपकी अभिव्यक्ति रनटाइम में उत्पन्न होती है)।
यहाँ है के लिए प्रलेखन ::std::regex_match
। इस मामले में आप जो अधिभार चाहते हैं, वह अधिभार 6 है, जो लेता है ::std::string
और ए ::std::basic_regex
तर्क के रूप में।