果然正则表达式是一个强大的工具

更短的代码....hhh

版本1: 正则表达式..so easy~~

 #include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <regex>
using namespace std;
const int N = ;
const string s_int = "([0-9]+)";
const string s_str = "([0-9A-Za-z-_\.]+)";
const string s_path = "([0-9A-Za-z-_\./]+)";
string rule[N], na[N];
vector <int> p[N]; // 表示匹配项类型 1-int;2-str;3-path
int n, m;
smatch sm;
string _deal(string str, int k) {// 将"int"->s_int'... 变成正则表达式的情况
string ans;
for (int i = ; i < str.size(); i++) {
if (str[i] == '<') {
string tmp; i++;
while (str[i] != '>')
tmp.push_back(str[i++]);
if (tmp == "int") { ans += s_int; p[k].push_back(); }
else if (tmp == "str") { ans += s_str; p[k].push_back(); }
else { ans += s_path; p[k].push_back(); }
}
else ans.push_back(str[i]);
}
return ans;
}
int main()
{
cin >> n >> m;
for (int i = ; i <= n; i++) {
string s1;
cin >> s1 >> na[i];
rule[i] = _deal(s1, i);
}
for (int i = ; i <= m; i++) {
string str; cin >> str;
string ans = ""; int k = ;
for (; k <= n; k++) {
regex re(rule[k]);
if (regex_match(str,sm,re)) {
ans = na[k];
break;
}
}
cout << ans;
if (ans != "")
for (int j = ; j < p[k].size(); j++) {
if (p[k][j] == ) cout << " " <<stoi(sm[j+]);
else cout << " " << sm[j+];
}
cout << "\n";
}
//system("pause");
return ;

版本2: split() 用/来分割字符串  [以前写的 好复杂啊

 #include <bits/stdc++.h>
using namespace std;
vector <string> name();
vector < vector <string> > rule();
vector <string> ans;
bool wei[];
bool isdight (char x) {
return x>=''&&x<='';
}
bool ischar (char x) {
if (isdight(x) )
return true;
if ( (x>='A' && x<='Z') || (x>='a' && x<='z') )
return true;
if ( x=='/' || x=='-' || x=='_' || x=='.')
return true;
return false;
}
vector <string> split (const string& str,const char flag=' ') {
istringstream iss(str);
vector <string> sv;
string tmp;
while (getline(iss,tmp,flag))
sv.push_back(tmp);
return sv;
}
bool isok (string str) {
if (str[]!='/') return ;
for (int i=;i<str.size();i++) {
if (!ischar(str[i]))
return ;
}
return ; }
string dtoc (int x) {
string str;
if (x==) return "";
while (x) {
str+=x%+'';
x/=;
}
reverse(str.begin(),str.end());
return str;
}
bool ismatch (int k, string str) {
bool flag=;
ans.clear();
if (str[str.size()-]=='/') flag=;
vector <string> sv=split (str,'/'); for (int i=;i<rule[k].size();i++) {
if (i>=sv.size()) return ;
int len=sv[i].size();
if (rule[k][i]=="<int>") {
int sum=;
for (int j=;j<len;j++) {
if (!isdight(sv[i][j])) return ;
sum=sum*+sv[i][j]-'';
}
ans.push_back(dtoc(sum));
} else if (rule[k][i]=="<str>")
ans.push_back(sv[i]); else if (rule[k][i]=="<path>") {
string tmp;
for (int k=i;k<sv.size();k++) {
tmp+=sv[k];
if (k==sv.size()-&&!flag) continue;
tmp+="/";
}
ans.push_back(tmp);
return ;
} else {
if (sv[i]!=rule[k][i]) return ;
} }
if (rule[k].size()==sv.size()&&(flag==wei[k])) return ; // 真的是傻逼
else return ;
}
int n,m;
int main ()
{
cin>>n>>m; getchar();
string s1,s2;
for (int i=;i<=n;i++) {
cin>>s1>>s2; getchar();
name[i]=s2;
if (s1[s1.size()-]=='/') wei[i]=;// 没有考虑的地方
rule[i]=split(s1,'/');
}
for (int i=;i<=m;i++) {
getline (cin,s1); int x=;
if (isok(s1)) {
for (int j=;j<=n;j++)
if (ismatch(j,s1)) {
x=j;
break;
}
}
if (x==) cout<<""<<endl;
else {
cout<<name[x];
for (int j=;j<ans.size();j++)
cout<<" "<<ans[j];
cout<<endl;
}
}
return ;
}

CCF-URL映射-(正则匹配)-20180303的更多相关文章

  1. Django2.0以上版本的URL的正则匹配问题

    正则表达式形式的URL匹配问题: 1.导入re_path from django.urls import path,re_path 2.进行正则匹配 re_path('detail-(\d+).htm ...

  2. CCF(URL映射:80分):字符串处理+模拟

    URL映射 CCF201803-3 #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  3. 基于URL的正则匹配

    第一种的方式使用( <li><a target="_blank" href="/CC/detail/?nid={{ k}}">{{ ro ...

  4. SpringMvc如何将Url 映射到 RequestMapping (二)

    昨天简单分析了Springmvc 中 RequestMapping 配置的url和请求url之间的匹配规则.今天详细的跟踪一下一个请求url如何映射到Controller的对应方法上 一.入口 org ...

  5. CCF 201803-3 URL映射

    CCF 201803-3  URL映射 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django. ...

  6. 正则匹配之url的匹配

    通过这几天的学习,已经对正则有所了解了. 下面动手写一个匹配url的正则吧. <?php $str="http://www.baidu.com"; $reg="/( ...

  7. js:通过正则匹配获取页面的url中的参数

    简介:获取页面参数 原生js: //通过正则匹配获取当前页面的url中的参数 function getUrlParam(name){ var reg = new RegExp("(^|&am ...

  8. Django2.0版本 path与Django1.x版本url正则匹配问题

    Django1.x版本url正则匹配如下: Django2.0版本正则匹配则要导入re_path模块如下:

  9. CCF CSP 201803-3 URL映射

    转载自 https://blog.csdn.net/tigerisland45/article/details/81697594 /* CCF201803-3 URL映射 */ #include &l ...

随机推荐

  1. vue_elementUI_ tree树形控件 获取选中的父节点ID

    el-tree 的 this.$refs.tree.getCheckedKeys() 只可以获取选中的id 无法获取选中的父节点ID想要获取选中父节点的id;需要如下操作1. 找到工程下的node_m ...

  2. 剑指offer(14)链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...

  3. bzoj1001狼抓兔子 对偶图优化

    bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...

  4. Paper Read: Convolutional Image Captioning

    Convolutional Image Captioning 2018-11-04 20:42:07 Paper: http://openaccess.thecvf.com/content_cvpr_ ...

  5. (转载)Unity3D开发之编辑器统一修改Text字体

    最近遇到一个需求,就是我们在做完一个场景后,美工感觉字体不好看,效果不是很好,想要换一种字体.UGUI的界面已经搭完,如果要一个一个Text寻找,工作量将是巨大.而且作为程序人员是不会容忍自己做这些机 ...

  6. 【Entity Framework】disable automatic migration, 执行update-migration仍然会显示有automatic migration

    本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文 [Entity Framework] disable automatic migration, 执行update-migrati ...

  7. Linux配置中文输入法(搜狗输入法)

    一.基础知识 在原生ubuntu14.04英文环境系统中只有IBus拼音,真的好难用.由于搜狗输入法确实比Linux系统下其它的中文输入法都要好用得多,所以我决定在我的Ubuntu 14.04系统中安 ...

  8. strcpy函数解析

    char * strcpy( char *strDest, const char *strSrc ) { assert((strDest != NULL)&&(strSrc != NU ...

  9. sony Z5P 刷rec、root的方法

    想root需要刷第三方recovery,刷recovery需要先解锁.但如果直接解锁,会丧失相机算法.屏幕超逼真模式,所以不能直接来. 大体步骤就是解完锁后自己做个内核刷进去,欺骗系统让他觉得没解锁. ...

  10. Android 按钮响应事件的几种方式

    目录 1.在布局中指定onClick属性 2.使用匿名内部类 3.在当前Activity中实现OnClickListener接口 4.创建内部类 1.在布局中指定onClick属性 布局代码 < ...