In Regex würde es lauten 0x[0-9a-fA-F]+
aber wie kann man das in reinem C++ erreichen?
Antworten
Zu viele Anzeigen?Sie können die eingebauten Methoden von std::string
um zu prüfen, ob der erste Teil der Zeichenkette das Literal "0x" ist und ob der Rest der Zeichenkette nur die erlaubten Zeichen enthält. Hier ist das Äquivalent zu dem in der Frage angegebenen regulären Ausdruck:
bool is_hex_notation(std::string const& s)
{
return s.compare(0, 2, "0x") == 0
&& s.size() > 2
&& s.find_first_not_of("0123456789abcdefABCDEF", 2) == std::string::npos;
}
Rufen Sie an. strtoul
und prüfen, ob ein Fehler vorliegt.
Versuchen Sie Folgendes
bool IsHex(const std::string& str) {
if (str.length < 3 || str[0] != '0') {
return false;
}
if (str[1] != 'x' && str[1] != 'X') {
return false;
}
for (size_t i = 2; i < str.length; i++) {
char current = str[i];
if (current >= '0' && current <= '9') {
continue;
}
if (current >= 'A' && current <= 'F') {
continue;
}
if (current >= 'a' && current <= 'f') {
continue;
}
return false;
}
return true;
}
Sie könnten stattdessen Folgendes verwenden strspn um auf eine gültige Basis zu prüfen. http://www.cplusplus.com/reference/cstring/strspn/
Beispiel unten in C++ prüft diese Methode auf eine beliebige gültige Radixbasis von binär-zu-basis32
/* strspn valid-number example */
#include<iostream>
#include<cstdlib>
#include<cstring>
#define BINARY_BASE 2 /*Defining binary base*/
#define OCTAL_BASE 8 /*Defining octal base*/
#define DECIMAL_BASE 10 /*Defining decimal base*/
#define HEXA_BASE 16 /*Defining hexa-decimal base*/
#define BASE32_BASE 32 /*Defining base32 base*/
bool isValidNumber4Base(const char* numStr,int base)
{
const char *validBinary = "01";
const char *validOctal = "01234567";
const char *validDecimal = "0123456789";
const char *validHex = "0123456789abcdefxABCDEFX";
const char *validBase32 = "0123456789abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUV";
const char *validNumber = NULL;
validNumber = (base == BINARY_BASE) ? validBinary : ((base == OCTAL_BASE) ? validOctal :
(base == DECIMAL_BASE) ? validDecimal : (base == HEXA_BASE) ? validHex : (base == BASE32_BASE) ? validBase32 : NULL);
if(validNumber == NULL)
{
std::cerr<<"Invalid base encountered"<<std::endl;
exit(EXIT_FAILURE);
}
return (!numStr[strspn(numStr,validNumber)]) ? true : false;
}
/*Test Method */
int main ()
{
char *hexa_str = "0xFF";
std::cout<<"Valid Hexa : "<<std::boolalpha<<isValidNumber4Base(hexa_str,HEXA_BASE)<<std::endl;
return 0;
}
- See previous answers
- Weitere Antworten anzeigen