[英]How to use regex to match strings that don't contain special characters (&, \, <, >, |, ) unless they are proceeded by a backslash
現在我正在使用[^ \\\\&<>|\\t\\n]+
,它將匹配任何包含非空格字符的字符串,\\,&,<,>,|,\\ t,\\ n。 我想要做的是允許你轉義任何這些特殊字符,以便(例如)\\ <或\\&仍然允許我的整個字符串匹配。
應該匹配:
abcdefghijk abcdef\\&hdehud\\<jdow\\\\
不應該匹配:
abcdefhfh&kdjeid abcdjedje\\idwjdj
我發現這個模式([^\\[]|(?<=\\\\)\\[)+
只對“[”字符做同樣的事情。 我無法弄清楚如何擴展它以適用於任何其他角色。
知道如何為反斜杠前面的字符設置例外嗎?
如果它有所不同,我在Flex和C ++中使用它來為shell標記字符串。 我相信我需要使用負面的后衛,但我不知道如何使用多個角色。
你已經回答了大部分問題:
你正在使用否定集[^ \\\\&<>|\\t\\n]
來指定哪些字符可能不存在,所以你所要做的就是使用相同的集合,而沒有以\\
前面的否定來逃避字符。 這可以讓你得到這個\\\\[ \\\\&<>|\\t\\n]
,它可以被讀作“一個\\
后面跟着集合中的任何一個項目”現在結合這兩個你就得到了([^ \\\\&<>|\\t\\n]|\\\\[ \\\\&<>|\\t\\n])+
。
要打破它:
以下一項或多項: [^ \\\\&<>|\\t\\n]
或\\\\[ \\\\&<>|\\t\\n]
像往常一樣,在這里使用正則表達式是過度的。 這是一個簡單的文本搜索:
const std::string target = "\\&<>|";
std::string iter = str.find_first_of(target);
while (iter != str.end()) {
if (*iter != '\\')
found_bad_character(*iter);
iter = str.find_first_of(target, std::next(iter));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.