如何使用正则表达式匹配不包含特殊字符(&、\、<、>、|、)的字符串,除非它们以反斜杠开头

How to use regex to match strings that don't contain special characters (&, \, <, >, |, ) unless they are proceeded by a backslash

现在我正在使用 [^ \&<>|\t\n]+,它将匹配任何包含非 space、\、&、<、>、|、\t、\n 字符的字符串。我想要做的还允许您转义任何这些特殊字符,以便(例如)\< 或 \& 仍然允许匹配我的整个字符串。

应匹配:

abcdefghijk abcdef\&hdehud\<jdow\

不应该匹配:

abcdefhfh&kdjeid abcdjedje\idwjdj

我发现这个模式 ([^\[]|(?<=\)\[)+ 只对“[”字符做同样的事情。我无法弄清楚如何将其扩展以应用于任何其他字符。

知道如何为以反斜杠开头的字符设置例外吗?

如果它有任何不同,我在 Flex 和 C++ 中使用它来标记 shell 的字符串。我相信我需要使用负面回顾,但我不知道如何使用多个字符来做到这一点。

您已经找到答案的大部分内容了:

您正在使用取反集 [^ \&<>|\t\n] 来指定哪些字符可能不存在,因此您所要做的就是使用相同的集,而不使用前面带有 \ 的取反集来转义性格。这让你得到这个 \[ \&<>|\t\n] 可以读作 "a \ followed by any one of the items in the set" 现在将两者结合起来你会得到 ([^ \&<>|\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));
}