C语言中的正则表达式检测非单词字符

时间:2014-09-03 01:16:09

标签: c regex string

我正在尝试创建一个脚本来检测用户名上的“不正确”字符。我认为最好的解决方案是应用正则表达式。我已经为此创建了一个示例脚本,但是我找不到正确的组合来检测“坏/错”字符。

更新:我正在使用的正则表达式我在Wikipedia Regular expressions

上找到了它

代码示例:

#include <stdio.h> /* stderr, stdout */
#include <string.h> /* stncpy, strncat etc. */
#include <stdlib.h> /* memory allocation, process control etc. */
#include <sys/types.h>
#include <regex.h>

#define tofind "[^A-Za-z0-9_] $" /* Non word characters */ 
#define MAX_USERS 4
#define MAX_CHARACTERS 20

typedef struct rec {
  char users[MAX_USERS][MAX_CHARACTERS];
}TEMPORARY;

int main (void) {
  regex_t regex;
  int reti , i;

  TEMPORARY *ptr_record;

  ptr_record = (TEMPORARY *) malloc (sizeof(TEMPORARY));

  if (ptr_record == NULL) {
    printf("Out of memmory!\nExit!\n");
    exit(0);
  }

  printf("Sizeof users: %li\n",sizeof(*ptr_record).users);

  /* Compile regular expression */
  reti = regcomp(&regex, tofind, REG_EXTENDED);
  if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }

  for(i = 0; i < MAX_USERS; i++) {
    printf("Enter username[%i]:\n",i);
    scanf( " %[^\n]" , (*ptr_record).users[i] );

    /* Execute regular expression */
    reti = regexec(&regex, (*ptr_record).users[i], 0, NULL, 0);
    if( !reti ){
      puts("Match");
    }
    else if( reti == REG_NOMATCH ){
      puts("No match");
    }
    else{
      regerror(reti, &regex, (*ptr_record).users[i], sizeof((*ptr_record).users));
      fprintf(stderr, "Regex match failed: %s\n", (*ptr_record).users[i]);
      exit(1);
    }
  }

  /* Free compiled regular expression if you want to use the regex_t again */
  regfree(&regex);

  for(i = 0; i < MAX_USERS; i++) {
    printf("Username[%i][%s]:\n",i,(*ptr_record).users[i]);
  }

 return 0;

}

更新2:代码的输入和输出:

Enter username[0]:
Th@nos
No match
Enter username[1]:
t#est
No match
Enter username[2]:
!anotherT$est
No match
Enter username[3]:
S%mple
No match
Username[0][Th@nos]:
Username[1][t#est]:
Username[2][!anotherT$est]:
Username[3][S%mple]:

我认为所有这些输入都会被正则表达式检测到并产生不匹配。

1 个答案:

答案 0 :(得分:0)

回答具体问题:经过一些实验,我终于理解了我做错了什么。我的正则表达式没有正确定义。因此,在我要应用的特定任务中,正确的正则表达式将是"[^A-Za-z0-9_]"而不是"[^A-Za-z0-9_] $"。它完美适用于输出样本:

Enter username[0]:
thanos
No match
Enter username[1]:
thanos test
Match
Enter username[2]:
th#no
Match
Enter username[3]:
test
No match
Username[0][thanos]:
Username[1][thanos test]:
Username[2][th#no]:
Username[3][test]:

最后一条评论让我感到不舒服。人们正在投票。在某些情况下,我同意他们,但这些情况非常严重。所有这些&#34;完美的编码员&#34;应该记住当他们在哪里学习时,他们的感受是什么。那时他们不知道甚至基本知识对他们来说这么容易解决他们的问题?我认为这个论坛是关于人们在他们无法自己解决问题时要求编码建议的全部内容。我无法在互联网上找到我的问题的相关答案,这是我第一次在C中使用正则表达式而且我是C编程的初学者。总而言之,在你投票之前,人们会对一个问题进行投票,更容易评论和说些什么(例如你的问题不清楚或你的代码不好)。