3

有没有一种方法可以检查这些情况?还是我需要解析字符串中的每个字母,并检查它是否是小写(字母)并且是数字/字母?

4

6 回答 6

5

您可以使用islower()isalnum()来检查每个字符的这些条件。没有字符串级别的函数可以执行此操作,因此您必须自己编写。

于 2012-07-03T00:32:52.803 回答
3

假设“C”语言环境是可以接受的(或换成不同的字符集criteria),使用find_first_not_of()

#include <string>

bool testString(const std::string& str)
{
      std::string criteria("abcdefghijklmnopqrstuvwxyz0123456789");
      return (std::string::npos == str.find_first_not_of(criteria);
}
于 2012-07-03T00:42:17.383 回答
3

它不是很为人所知,但语言环境实际上确实具有一次确定整个字符串特征的功能。具体来说,ctype语言环境的 facet 具有 ascan_is和 a scan_not,用于扫描适合指定掩码(字母、数字、字母数字、小写字母、大写字母、标点符号、空格、十六进制数字等)的第一个字符,或不适合的第一个字符。分别适合它。除此之外,它们的工作方式有点像std::find_if,返回您作为“结束”传递的任何内容以表示失败,否则返回指向字符串中不符合您要求的第一项的指针。

这是一个快速示例:

#include <locale>
#include <iostream>
#include <iomanip>

int main() {

    std::string inputs[] = { 
        "alllower",
        "1234",
        "lower132",
        "including a space"
    };

    // We'll use the "classic" (C) locale, but this works with any
    std::locale loc(std::locale::classic());

    // A mask specifying the characters to search for:          
    std::ctype_base::mask m = std::ctype_base::lower | std::ctype_base::digit;

    for (int i=0; i<4; i++) {
        char const *pos;
        char const *b = &*inputs[i].begin();
        char const *e = &*inputs[i].end();

        std::cout << "Input: " << std::setw(20) << inputs[i] << ":\t";

        // finally, call the actual function:
        if ((pos=std::use_facet<std::ctype<char> >(loc).scan_not(m, b, e)) == e)
            std::cout << "All characters match mask\n";
        else
            std::cout << "First non-matching character = \"" << *pos << "\"\n";
    }
    return 0;
}

我怀疑大多数人会更喜欢std::find_if使用它——使用它几乎相同,可以很容易地推广到更多情况。尽管这具有更窄的适用性,但它对用户来说并不是很容易(尽管我想如果你正在扫描大块文本,它可能至少会快一点)。

于 2012-07-03T04:20:24.973 回答
0

您可以使用 tolower 和 strcmp 来比较 original_string 和 tolowered 字符串。然后每个字符单独计算数字。

(或)按字符执行以下操作。

#include <algorithm>

static inline bool is_not_alphanum_lower(char c)
{
    return (!isalnum(c) || !islower(c));
}

bool string_is_valid(const std::string &str)
{
    return find_if(str.begin(), str.end(), is_not_alphanum_lower) == str.end();
}

我使用了一些信息: 确定字符串是否仅包含字母数字字符(或空格)

于 2012-07-03T00:46:05.353 回答
0

只需使用std::all_of

bool lowerAlnum = std::all_of(str.cbegin(), str.cend(), [](const char c){
    return isdigit(c) || islower(c);
});

如果您不关心语言环境(即输入是纯 7 位 ASCII),则可以将条件优化为

[](const char c){ return ('0' <= c && c <= '9') || ('a' <= c && c <= 'z'); }
于 2019-03-15T02:31:25.733 回答
-1

如果您的字符串包含 ASCII 编码的文本并且您喜欢编写自己的函数(就像我一样),那么您可以使用它:

bool is_lower_alphanumeric(const string& txt)
{
  for(char c : txt)
  {
    if (!((c >= '0' and c <= '9') or (c >= 'a' and c <= 'z'))) return false;
  }
  return true;
}
于 2012-07-03T01:03:05.707 回答