2016-06-10 72 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]+);"。這也可以讓你將空格添加到不會被忽略的正則表達式中。但是額外的引號可能會使編寫起來有點費力。