Как найти, если данная строка соответствует шестнадцатеричной записи, например. 0x34FF без регулярных выражений? - PullRequest
3 голосов
/ 17 января 2012

В регулярном выражении это будет 0x[0-9a-fA-F]+, но как этого добиться в чистом с ++?

Ответы [ 5 ]

13 голосов
/ 17 января 2012

Вы можете использовать встроенные методы std::string, чтобы проверить, что первая часть строки является литералом "0x" и что остальная часть строки содержит только разрешенные символы.Вот эквивалент регулярного выражения, приведенного в вопросе:

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;
}
3 голосов
/ 17 января 2012

Позвоните strtoul и проверьте на наличие ошибки.

2 голосов
/ 17 января 2012

Попробуйте следующее

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;
}
1 голос
/ 23 июня 2018

С C ++ 11 вы можете сделать это легко:

std::string str = "FF22ABCD16ZZ";

if (std::all_of(str.begin(), str.end(), ::isxdigit)) {
    std::cout << str << " contains only hexadecimal digits" << std::endl;
}
0 голосов
/ 25 ноября 2017

Вы можете использовать это вместо strspn , чтобы проверить правильность базы. http://www.cplusplus.com/reference/cstring/strspn/

пример ниже в C ++, этот метод проверяет наличие любого допустимого основания двоичная к base32

/* 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;
}
...