从前向后一个个字符匹配,没有技巧,注意指到位置就好
(无注释,万分抱歉)
#include<stdio.h>
#include <queue>
#include <vector>
#include <set>
#include <iostream>
#include <map>
#include <memory.h>
using namespace std;
/*
albw:x
4
ls -w 10 -x -w 15
*/
bool ifElement[60]={false};
bool ifexit[60]={false};
int main(){
string rule;
cin >> rule;
for(int i=0;i<rule.size();i++){
if(rule[i]!=':')
ifexit[rule[i]-'a']=true;
if(i+1<rule.size()){
if(rule[i+1]==':'){
// cout << "pp: " << rule[i] << endl;
ifElement[rule[i]-'a']=true;
}
}
}
int num;
cin >> num;
getchar();
for(int i=1;i<=num;i++){
map<char,string> val;
string cmd;
getline(cin,cmd);
// cout << cmd << endl;
int p1=1,p2=0;
while(p1<cmd.size()){
while(cmd[p1]!=' ') p1++;
while(++p1){
if(p1>cmd.size()) break;
while(cmd[p1]==' ') p1++;
if(cmd[p1]!='-') goto bad;
if(p1+1>=cmd.size()) goto bad;
char c=cmd[p1+1];
if(!ifexit[c-'a']) goto bad;
p1++;
string _val;
if(ifElement[c-'a']){
if(cmd[p1+1]!=' ' || !(isalpha(c) || isdigit(c) || c=='-') || p1+2>=cmd.size()) goto bad;
p1+=2;
for(int j=p1;j<cmd.size();j++){
if(cmd[j]!=' '){
p1++;
_val+=cmd[j];
}
else break;
}
}
if(ifElement[c-'a'] && _val.empty()) goto bad;
val[c]=_val;
}
}
bad:{};
printf("Case %d:",i);
auto it=val.begin();
for(;it!=val.end();it++){
if(ifElement[it->first-'a'] && it->second.empty()) continue;
cout << " -";
cout << it->first;
if(!it->second.empty()){
cout << ' ';
cout << it->second;
}
}
cout << endl;
}
return 0;
}