Как использовать std :: regex_match с CString? - PullRequest
3 голосов
/ 21 апреля 2020

Когда я пытаюсь использовать std :: regex с CString (MF C), я получаю эту ошибку:

enter image description here

И это код:

const std::regex pattern("^[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]$");

const CString& csTest = "28.10.1991";

if (std::regex_match(csTest, pattern))

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Нет однозначного преобразования CString в первый параметр любой из std::regex_match перегрузок.

Добавьте GetString() для явного преобразования в const TCHAR *:

std::regex_match(csTest.GetString(), pattern)

Или, если вы хотите использовать диапазон итераторов (что может быть микрооптимизацией), используйте дополнительно GetLength():

std::regex_match(csTest.GetString(), csTest.GetString() + csTest.GetLength(), pattern)

В комментарии рекомендуется использовать CAtlRegExp. Вы можете сделать это тоже, но обратите внимание, что CAtlRegExp имеет нестандартный синтаксис, а также имеет некоторые ошибки и даже больше не является частью ATL, поставляемой с Visual Studio (часть «сервера ATL», которая отделена от ATL начиная Visual Studio 2008). Так что я бы не стал использовать CAtlRegExp.

0 голосов
/ 22 апреля 2020

В регулярном выражении есть еще одна ошибка: точка соответствует любому символу, поэтому регулярное выражение также соответствует "1234567890" и "12x34y5678", которые действительно не являются действительными датами. Точка должна быть удалена. http://www.cplusplus.com/reference/regex/ECMAScript/

Использование: const std::regex pattern("^[0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9][0-9][0-9]$");

Как говорили другие, преобразуйте строку CStest CString в строку C, тогда как CString - MF C класс строки и строка C является строкой, соответствующей языку C:

if (std::regex_match(csTest.GetString(), pattern)) ...
...