如何使用正则表达式匹配不包含特殊字符(&、\、<、>、|、)的字符串,除非它们以反斜杠开头
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));
}
现在我正在使用 [^ \&<>|\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));
}