Member 13089825 Ответов: 3

Проверка строк для пользовательского ввода


я делаю проверку strin ,когда когда-либо пользователь дает ввод, как показано ниже символов, я ahve бросаю ошибку, как не допустимая строка.
"/ \ [ ] : ; | = , + * ? < >

но я получаю ошибку как
"Исключение Microsoft C++: std::regex_error в ячейке памяти 0x000000000019A210."

Что я уже пробовал:

боол ValidateLoginid(CString в функции inputstring)
{std::regex stringpattern("[!/\[]:;|=,+*<>]*");

std::string s_input(CW2A(inputString.Метода getString()));
if (std::regex_match(s_input, stringpattern))
{
возвращать false;
}

вернуть true;


}

не могли бы вы подсказать мне, если здесь что-то не так

3 Ответов

Рейтинг:
2

Jochen Arndt

Это происходит потому, что вы забыли экранировать закрывающую квадратную скобку в группе символов и что они должны быть дважды экранированы (так что обратная косая черта помещается в строку, чтобы ее видел анализатор регулярных выражений):

wrong:   "[!/\[]:;|=,+*<>]*"
correct: "[!/\\[\\]:;|=,+*<>]*"

Вам также не нужно преобразовывать входные данные в ANSI при использовании wregex класс, предоставляемый Visual C++:
bool ValidateLoginid(const CString& inputString)
{
    std::wregex stringpattern(L"[!/\\[\\]:;|=,+*<>]*");
    return !std::regex_match(inputString.GetString(), stringpattern);
}
Обратите также внимание, что я изменил параметр на ссылку const, чтобы избежать передачи по значению и указать, что он не изменен.

Также нет необходимости использовать регулярное выражение, Если вы хотите только проверить, присутствуют ли определенные символы или нет. Тогда просто используйте strstr или CString::FindOneOf.


Member 13089825

Привет,я пробовал это,но это не ошибка thorwing, когда я даю test+, test>(Если я даю комбинацию, то это не бросает ошибку)
bool ValidateLoginid(const CString& inputString)
{
std::wregex stringpattern(L"[!/\\[\\]:;|=,+*<>]*");
return !std::regex_match(inputString.И getString(), stringpattern);
}

Jochen Arndt

Как также предлагали другие, вы должны заменить последний символ соответствия '*' на '+' или '+?'.
Я не могу на самом деле проверить это здесь и написал свое решение из ума.

Однако я бы просто использовал

if (inputString.FindOneOf(_T("!/[]:;|=,+*<>")) >= 0)
// error: string contains unallowed character

Member 13089825

спасибо,теперь он работает нормально

Member 13089825

неправильно: "[!/\[]:;|=,+*<>]*"
правильно: "[!/\\[\\]:;|=,+*<>]*"
можно ли проверить правильность шаблона или нет с помощью vc++ mfc

Jochen Arndt

? Вы, кажется, перестали печатать.

Рейтинг:
1

OriginalGriff

Посмотрите на свое регулярное выражение:

[!/\[]:;|=,+*<>]*
Он содержит символы для начала и окончания "любого символа в этом наборе" в наборе символов, а также Escape-символ!
Попробовать это:
[!/\\[\]:;|=,+*<>]*

Но... это не будет соответствовать никаким специальным символам вообще - попробуйте это:
[!/\\[\]:;|=,+*<>]+

О, и вам, вероятно, нужно удвоить каждый символ '\' в вашей строке C++, чтобы он не был "проглочен" как Escape-символ C++ :
std::regex stringpattern("[!/\\\\[\\]:;|=,+*<>]+");


Если вы хотите использовать регулярные выражения, получите копию Экспрессо[^] - это бесплатно, и он проверяет и генерирует регулярные выражения.


Рейтинг:
0

Thomas Daniels

Есть несколько проблем с вашей строкой:


  • Обратная косая черта внутри вашего класса символов не экранируется, так что \[ рассматривается как escape-последовательность, но ее не существует. И если бы вы избежали обратной косой черты, например \\, таким образом, это будет "в конечном итоге" быть одной обратной косой чертой, регулярное выражение будет интерпретировать это как "следующий символ должен быть буквальным символом", поэтому вам нужно добавить другой обратная косая черта, и в вашей строке это будет выглядеть как еще одна двойная обратная косая черта. Таким образом, для литеральной обратной косой черты в регулярном выражении вам нужно 4 обратных косых черты в вашей строке.
  • То ] в классе символов заканчивается класс символов, но вы хотите, чтобы он "шел дальше", поэтому вам нужно избежать ] В регулярном выражении это было бы \], но поскольку вам нужно избежать обратной косой черты в строке, она становится \\].

Так оно и становится:
std::regex stringpattern("[!/\\\\[\\]:;|=,+*<>]*");

Но мы еще не закончили! Этот код не будет делать то, что вы хотите: возвращать false, если строка содержит один недопустимый символ. Причина в том, что regex_match соответствует полный строка, в то время как вы хотите искать. Вместо regex_match, использовать regex_search.

И еще одно, последнее: * после символа класс означает "ноль или больше". Это не то, что вы хотите: вы хотите "одного или нескольких". Вы можете заменить * на+, но поскольку вы ищете, вы также можете просто удалить *, так что ваш код становится:
std::regex stringpattern("[!/\\\\[\\]:;|=,+*<>]");

// ...

if (std::regex_search(s_input, stringpattern))
{
    return false;
}
return true;


Member 13089825

его бросание ошибка, когда я даю эти чартеры в одиночку
но когда я enetred как ниже
тест>
<]тест
>Тест]++
это не бросает ошибку, но мне нужно бросить ошибку даже в этом случае(моя строка не должна содержать эти символы)
не могли бы вы предложить мне
я пробовал, как

боол ValidateLoginid(CString в функции inputstring)
{
//..std::regex stringpattern("[a-zA-Z0-9][0-9a-zA-Z_!@#$%^&()']*");
СТД::регулярное выражение stringpattern("[!/\\\\[\\]:;|=,+*&ЛТ;&ГТ;]*");

std::string s_input(CW2A(inputString.Метода getString()));
if (std::regex_match(s_input, stringpattern))
{
возвращать false;
}

вернуть true;


}

Thomas Daniels

Я не получу ошибку, если попробую это сделать, но мой тестовый код немного более "минималистичен", чем ваш код... Как выглядит s_input в конце? Что CW2A делает с ним?