⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 正则表达式源代码
💻 CPP
字号:
/* * * Copyright (c) 1998-2002 * Dr John Maddock * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation.  Dr John Maddock makes no representations * about the suitability of this software for any purpose.   * It is provided "as is" without express or implied warranty. * */  /*  *   FILE     main.cpp  *   VERSION  see <boost/version.hpp>  */#include <stdio.h>#include <boost/regex.hpp>#ifdef JM_OLD_IOSTREAM#include <iostream.h>#else#include <iostream>using std::cout;using std::cin;using std::cerr;using std::endl;#endif#ifdef __BORLANDC__#  pragma hrdstop#endif#include <boost/regex/v3/fileiter.hpp>#include "jgrep.h"#ifndef JM_ALGO_INCLUDED// HP and SGI STL's use <algo.h> instead// this will have been pulled in by <jm_cfg.h>// for std::distance#include <algorithm>#endifallocator_type a;re_type e(a);//rei_type ei(a);// flags for output:bool use_case = true;bool show_lines = false;bool count_only = false;bool files_only = false;bool recurse = false;bool regularexs = true;bool words_only = false;bool verbose = false;void usage(){   cout <<"jgrep version 0.95\n""usage: jgrep [-options] expression file [files...]\n""\n""options can be one of the following:\n""\n""-c   prints a count of the number of matching lines only\n""-d   recurses through subdirectories for matching files\n""-i   causes case to be ignored when matching\n""-l   lists the files which contain a match only\n""-n   displays the line numbers of matches\n""-r-  causes the expression to be interpreted as a literal string and not\n""     as a regular expression\n""-w   searches for matches that are whole words only\n""-z   verbose mode\n""\n""expression: a regular expression, or a literal string if -r- is specified\n""\n""files:  one or more files to search, the names can contain the wildcard\n""        characters ? and *\n" << endl;}void parse_switch(const char* flag){   ++flag;   while(*flag)   {      switch(*flag)      {         case '-':            switch(*(flag-1))            {               case 'c':                  count_only = false;                  break;               case 'd':                  recurse = false;                  break;               case 'i':                  use_case = false;                  break;               case 'l':                  files_only = false;                  break;               case 'n':                  show_lines = false;                  break;               case 'r':                  regularexs = false;                  break;               case 'w':                  words_only = false;                  break;               case 'z':                  verbose = false;                  break;               default:                  cout << "Undefined option -";                  cout.put(*flag);                  cout << endl;            }            // turn off prev character:            break;         case 'c':            count_only = true;            break;         case 'd':            recurse = true;            break;         case 'i':            use_case = false;            break;         case 'l':            files_only = true;            break;         case 'n':            show_lines = true;            break;         case 'r':            regularexs = true;            break;         case 'w':            words_only = true;            break;         case 'z':            verbose = true;            break;         case '?':            usage();            exit(0);         case '+':            break;         default:            cout << "Undefined option -";            cout.put(*flag);            cout << endl;      }      ++flag;   }}void HandleFile(const char* wild){   using namespace boost;   jm_trace("Handling file " << wild);   file_iterator end;   file_iterator start(wild);   if(recurse)   {      // go through sub directories:      char buf[MAX_PATH];      std::strcpy(buf, start.root());      int rootlen = strlen(buf);      if(*buf == 0)      {         std::strcpy(buf, ".");         std::strcat(buf, directory_iterator::separator());         std::strcat(buf, "*");      }      else      {         std::strcat(buf, directory_iterator::separator());         std::strcat(buf, "*");      }      jm_trace("Enumerating directories: " << buf);      directory_iterator dstart(buf);      directory_iterator dend;      // now get the file mask bit of "wild":      const char* ptr = wild + rootlen;      if(*ptr) ++ptr;      jm_trace("File mask part is: " << ptr);      while(dstart != dend)      {         std::sprintf(buf, "%s%s%s", dstart.path(), directory_iterator::separator(), ptr);         HandleFile(buf);         ++dstart;      }   }   std::for_each(start, end, process_grep);}int done = 0;void HandleArg(const char* arg){   using namespace boost;   jm_trace("Handling argument: " << arg);   if(*arg == '-')   {      parse_switch(arg);      return;   }   if(done == 0)   {      // parse regular expression      if(regularexs)      {         if(words_only == 0)         {            e.set_expression(arg, use_case ? regbase::normal : regbase::normal | regbase::icase);            //ei.set_expression(arg);         }         else         {            char* buf = new char[std::strlen(arg) + 8];            std::sprintf(buf, "\\<%s\\>", arg);            e.set_expression(buf, use_case ? regbase::normal : regbase::normal | regbase::icase);            //ei.set_expression(buf);            delete[] buf;         }      }      else      {         // we need to convert text to literal:         int len2 = std::strlen(arg);         int len = len2 * 5 + 6;         char buf[8];         char* buf2 = new char[len];         *buf2 = 0;         if(words_only)            std::strcpy(buf2, "\\<");         for(int j = 0; j < len2; ++j)         {            std::sprintf(buf, "\\0%o", int(arg[j]));            std::strcat(buf2, buf);         }         if(words_only)            std::strcat(buf2, "\\>");         e.set_expression(buf2, use_case ? regbase::normal : regbase::normal | regbase::icase);         //ei.set_expression(buf2);         delete[] buf2;      }      done = 1;      return;   }   // if we get to here we have one or more file names to process:   ++done;   HandleFile(arg);}int main(int argc, char * argv[]){   for(int i = 1; i < argc; ++i)      HandleArg(argv[i]);   if(done < 2)      usage();   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -