Как проверить строку для специальных символов?

Мое решение состоит в том, чтобы использовать встроенные компоненты с некоторыми резервными ошибками.

Я выбрал стратегию из ответа на другой подобный вопрос о stackoverflow, но я не могу его найти сейчас.

Он сначала проверяет спецификацию, используя встроенную логику в StreamReader, если есть спецификация, кодировка будет чем-то иным, чем Encoding.Default, и мы должны доверять этому результату.

Если нет, он проверяет является ли последовательность байтов действительной последовательностью UTF-8. если это так, он будет считать UTF-8 в качестве кодировки, а если нет, то в результате будет использоваться кодировка ASCII по умолчанию.

static Encoding getEncoding(string path) {
    var stream = new FileStream(path, FileMode.Open);
    var reader = new StreamReader(stream, Encoding.Default, true);
    reader.Read();

    if (reader.CurrentEncoding != Encoding.Default) {
        reader.Close();
        return reader.CurrentEncoding;
    }

    stream.Position = 0;

    reader = new StreamReader(stream, new UTF8Encoding(false, true));
    try {
        reader.ReadToEnd();
        reader.Close();
        return Encoding.UTF8;
    }
    catch (Exception) {
        reader.Close();
        return Encoding.Default;
    }
}
0
задан smac89 17 January 2019 в 07:55
поделиться

1 ответ

Я предполагаю, что предлагаемое вами решение состоит в том, чтобы проверить, все ли буквенно-цифровые символы находятся внутри строки. Этот метод не будет работать, потому что вы также должны учитывать длину строки, потому что можно получить строку, которая содержит все буквенно-цифровые символы плюс один специальный символ.

Если не считать вложенных тысяч операторов if для обнаружения не алфавитно-цифровых символов, это решение работает:

(я предполагаю, что Text можно повторять в , используя циклы for на основе диапазона)

Вы можете использовать std::find_if

#include <algorithm>
#include <iterator>
#include <cctype>
#include <iostream>

auto it = std::find_if(std::begin(Text), std::end(Text), [](const char c) {
    return std::isalnum(c) == 0; // Not alphanumeric
});

if (it == std::end(Text)) {
    std::cout << "Text is fine!";

} else {
    std::cout << "Text contains non-alphanumeric character: '" << *it << "'";
}

std::cout << std::endl;
0
ответ дан smac89 17 January 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: