尝试过滤掉C正则表达式

时间:2015-11-30 06:28:35

标签: c regex string escaping match

我在这里创建了一个代码,用于确定一个URL是否包含一组无效的字符,而正则表达式可能是一个很好的方法。

这里的问题是这个代码中的目标字符串(存储在char数组变量“find”的值中)不被视为有效匹配,即使我的正则表达式意味着至少匹配方括号之间的任何字符,字符集中列出了感叹号。

此外,在编译所有警告时,我会收到以下警告:

./test2.c:6:25: warning: unknown escape sequence '\#'
./test2.c:6:25: warning: unknown escape sequence '\!'
./test2.c:6:25: warning: unknown escape sequence '\$'
./test2.c:6:25: warning: unknown escape sequence '\&'
./test2.c:6:25: warning: unknown escape sequence '\-'
./test2.c:6:25: warning: unknown escape sequence '\;'
./test2.c:6:25: warning: unknown escape sequence '\='
./test2.c:6:25: warning: unknown escape sequence '\]'
./test2.c:6:25: warning: unknown escape sequence '\_'
./test2.c:6:25: warning: unknown escape sequence '\~'

让我烦恼的是:

./test2.c:6:25: warning: unknown escape sequence '\]'

因为如果我没有逃避它,那么我正在使用它来结束要检查的一组字符,但我希望该字符在检查中作为文字字符包含。

如何解决此正则表达式问题?

我希望能够在C之后创建一个apache模块,这样如果黑客尝试在URL中使用奇怪的不可接受的字符,他将被定向到错误页面。一旦我认为这个正则表达式搞砸了,那么我就会在路上。

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>

int main(){
  const char* regex="/^[\#\!\$\&\-\;\=\?\[\]\_\~]+$/";
  const char* find="!!!";
  regex_t r;int s;
  if ((s=regcomp(&r,regex,REG_EXTENDED)) != 0){
    printf("Error compiling\n");return 1;
  }
  const int maxmat=10;
  regmatch_t ml[maxmat];
  if (regexec(&r,find,maxmat,ml,0) != 0){
    printf("No match\n");
  }else{
    printf("Matched");
  }
  regfree(&r);
  return 0;
}

3 个答案:

答案 0 :(得分:0)

这个正则表达式似乎对我有用:

char* regex="(.*)[#!$&-;=?_~]+";

答案 1 :(得分:0)

您获得的各种警告来自C编译器本身,而不是正则表达式编译器。 C编译器对正则表达式或字符集一无所知。它确实知道字符串并行和C字符串的转义字符也是&#39; \&#39;所以它试图将所有反斜杠字符解释为C字符串转义字符,例如:

\n - newline 
\" - quote character
\\ - backslash character

为了将反斜杠传递给正则表达式引擎,必须首先在C字符串文字中对其进行转义。只需将所有\替换为\\,您就可以更好地使用正则表达式。

如果你可以选择使用符合C ++ 11的编译器进行编译,你可以选择使用原始字符串,它可以摆脱普通C字符串中的所有转义:

strlen("\n")      => 1
strlen(R"(\n)");  => 2

在第二种情况下,字符串以R"(开头并一直持续到找到)"。所以第二个字符串由两个字符\n组成,而不是一个换行符。

这对于使用正则表达式非常方便,因为它不需要多级转义字符。

答案 2 :(得分:0)

常见的初学者错误是假设您需要或想要在正则表达式类中反斜杠。你没有;在方括号内,每个字符都代表自己。有一些特殊情况需要特殊处理,但没有反斜杠。

  • 如果您想在字符类中使用文字^,则不能先使用它。
  • 如果你想在字符类中使用文字],它需要先行(在任何^之后指定否定)。
  • 如果你想在字符类中使用文字-,它需要先行(甚至在任何]之前,但在^之后用于否定字符类)或最后。

按照惯例,如果您同时需要][,则通常会将它们放在一起。

所以,你想要

const char* regex="^[-][#!$&;=?_~]+$";

正则表达式之前和之后的斜线看起来像你认为它们是正则表达式分隔符所必需或有用的;但他们不是,所以我把它们拿走了。

这将匹配仅由您班级中的字符组成的字符串。按照你的描述,这不是你想要的。但是你不需要一个正则表达式来查找字符串中某个字符的出现;看一般的C字符串搜索函数。

相关问题