Можем ли мы отформатировать строку std :: regex с пробелами / переносом строки, которые игнорируются — просто для лучшего чтения? Есть ли какой-либо вариант, как в Python VERBOSE)?
Без многословия:
charref = re.compile("&#(0[0-7]+""|[0-9]+""|x[0-9a-fA-F]+);")
С многословным:
charref = re.compile(r"""&[#] # Start of a numeric entity reference
(
0[0-7]+ # Octal form
| [0-9]+ # Decimal form
| x[0-9a-fA-F]+ # Hexadecimal form
)
; # Trailing semicolon
""", re.VERBOSE)
inline std::string remove_ws(std::string in) {
in.erase(std::remove_if(in.begin(), in.end(), std::isspace), in.end());
return in;
}
inline std::string operator""_nows(const char* str, std::size_t length) {
return remove_ws({str, str+length});
}
теперь это не поддерживает # comments
, но добавить это должно быть легко. Просто создайте функцию, которая удаляет их из строки, и сделайте это:
std::string remove_comments(std::string const& s)
{
std::regex comment_re("#[^\n]*\n");
return std::regex_replace(s, comment_re, "");
}
// above remove_comments not tested, but you get the idea
std::string operator""_verbose(const char* str, std::size_t length) {
return remove_ws( remove_comments( {str, str+length} ) );
}
После завершения мы получаем:
charref = re.compile(R"---(
&[#] # Start of a numeric entity reference
(
0[0-7]+ # Octal form
| [0-9]+ # Decimal form
| x[0-9a-fA-F]+ # Hexadecimal form
)
; # Trailing semicolon
)---"_verbose);
и сделано.
Просто разбейте строку на несколько литералов и используйте комментарии C ++ следующим образом:
std::regex rgx(
"&[#]" // Start of a numeric entity reference
"(""0[0-7]+" // Octal form
"|[0-9]+" // Decimal form
"|x[0-9a-fA-F]+" // Hexadecimal form
")"";" // Trailing semicolon
);
Затем они будут объединены в "&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);"
компилятором. Это также позволит вам добавлять пробелы в регулярные выражения, которые не будут игнорироваться. Однако дополнительные кавычки могут сделать это немного трудоемким для написания.