मैं std::regex और [:print:] वर्ण वर्ग का उपयोग करके गैर-मुद्रण योग्य वर्णों को निकालने का प्रयास कर रहा हूं। इनपुट स्ट्रिंग इस तरह हो सकती है "\nTesting\t regex and \n\n\t printable characters \a\b set \0\f"

यहां \n, \t, \a, \b, \0, \f गैर प्रिंट करने योग्य वर्ण हैं। मैं \ n और \ t को छोड़कर गैर-मुद्रण योग्य निकालना चाहता हूं।

std::regex nonprintable_regex("(^[[:print:]]+)");
std::smatch sm;
if (std::regex_search(str, sm, nonprintable_regex)) {
  str = std::regex_replace(str, nonprintable_regex, "");
}

लेकिन मुझे अपेक्षित परिणाम नहीं मिल रहा है।

"\nTesting\t regex and \n\n\t printable characters set "

मुझे पता है कि मुझे \ n और \ t के लिए कुछ जोड़ना है, लेकिन यह नहीं पता कि उस शर्त को कैसे जोड़ा जाए। कोई संकेत/सहायता, धन्यवाद

1
atulya 8 नवम्बर 2021, 16:19

1 उत्तर

सबसे बढ़िया उत्तर

आपको पहले रेगेक्स के लिए परीक्षण करने की आवश्यकता नहीं है, regex_search यहां कॉल करना बेमानी है।

^ एंकर केवल स्ट्रिंग की शुरुआत में मेल खाता है, इसलिए आप स्ट्रिंग की शुरुआत में किसी एक या अधिक प्रिंट करने योग्य वर्णों से मिलान करने का प्रयास कर रहे हैं, जो कि आप नहीं चाहते हैं।

किसी भी गैर-मुद्रण योग्य चार से मेल खाने के लिए आपको [^[:print:]] का उपयोग करने की आवश्यकता है, एक नकारात्मक ब्रैकेट अभिव्यक्ति जो किसी भी चार से मेल खाती है लेकिन एक printसक्षम चार।

आप उपयोग कर सकते हैं

std::regex nonprintable_regex("(?![\n\t])[^[:print:]]");
// Or
std::regex nonprintable_regex("[^[:print:]\n\t]+");

C++ डेमो देखें:

std::string str( "\nTesting\t regex and \n\n\t printable characters \a\b set \0\f" );
std::regex nonprintable_regex("(?![\n\t])[^[:print:]]");
str = std::regex_replace(str, nonprintable_regex, "");
std::cout << str << std::endl;

(?![\t\n]) नकारात्मक लुकहेड प्रतिबंधित करता है कि [^[:print:]] क्या मेल खा सकता है, अर्थात्, यह अब टैब और न्यूलाइन से मेल नहीं खा सकता है।

दूसरा तरीका यह है कि \n और \t को नेगेटेड ब्रैकेट एक्सप्रेशन में ही शामिल किया जाए ताकि इसे और भी तेज़ बनाया जा सके, [^[:print:]\n\t]+

3
Wiktor Stribiżew 8 नवम्बर 2021, 16:56
"[^[:print:]\n\t]" आसान हो सकता है डेमो
 – 
Jarod42
8 नवम्बर 2021, 16:54
सही है, यह एक एकल माइक्रो-प्रोग्राम में संकलित होगा और तेजी से मेल खाएगा, और + को इस पैटर्न के साथ सरल तरीके से उपयोग किया जा सकता है, जिससे यह और भी तेज हो जाएगा।
 – 
Wiktor Stribiżew
8 नवम्बर 2021, 16:56