2016-06-10 4 views
0

Можно ли форматировать строку std :: regex с пробелом/строкой, которая игнорируется - просто для лучшего чтения? Есть ли какой-либо вариант, например, в Python VERBOSE)?std :: regex игнорировать пробелы внутри команды регулярного выражения

Без многословным:

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) 
+0

Я так не думаю. Вы можете использовать строковый литерал и передать его другой функции, которая удаляет пробелы, а затем компилирует ее в регулярное выражение, но вам придется написать эту функцию удаления. – Cornstalks

+1

Вы можете разделить строковый литерал на несколько строк, как показано в первом примере. У вас могут быть комментарии по этим строкам. –

ответ

3
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); 

и сделал.

2

Просто разбить строку на несколько литералов и использовать комментарии 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]+);" компилятором. Это также позволит вам добавить пробелы в регулярное выражение, которое не будет игнорироваться. Однако дополнительные кавычки могут сделать это немного сложнее написать.