CCF-URL映射-(正则匹配)-20180303
果然正则表达式是一个强大的工具
更短的代码....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的更多相关文章
- Django2.0以上版本的URL的正则匹配问题
正则表达式形式的URL匹配问题: 1.导入re_path from django.urls import path,re_path 2.进行正则匹配 re_path('detail-(\d+).htm ...
- CCF(URL映射:80分):字符串处理+模拟
URL映射 CCF201803-3 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- 基于URL的正则匹配
第一种的方式使用( <li><a target="_blank" href="/CC/detail/?nid={{ k}}">{{ ro ...
- SpringMvc如何将Url 映射到 RequestMapping (二)
昨天简单分析了Springmvc 中 RequestMapping 配置的url和请求url之间的匹配规则.今天详细的跟踪一下一个请求url如何映射到Controller的对应方法上 一.入口 org ...
- CCF 201803-3 URL映射
CCF 201803-3 URL映射 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django. ...
- 正则匹配之url的匹配
通过这几天的学习,已经对正则有所了解了. 下面动手写一个匹配url的正则吧. <?php $str="http://www.baidu.com"; $reg="/( ...
- js:通过正则匹配获取页面的url中的参数
简介:获取页面参数 原生js: //通过正则匹配获取当前页面的url中的参数 function getUrlParam(name){ var reg = new RegExp("(^|&am ...
- Django2.0版本 path与Django1.x版本url正则匹配问题
Django1.x版本url正则匹配如下: Django2.0版本正则匹配则要导入re_path模块如下:
- CCF CSP 201803-3 URL映射
转载自 https://blog.csdn.net/tigerisland45/article/details/81697594 /* CCF201803-3 URL映射 */ #include &l ...
随机推荐
- Linux查看服务器硬件配置命令
一.查看服务器硬件信息 dmidecode|grep "System Information" -A9|egrep "Manufacturer|Product|Seria ...
- gets() 与 scanf() 的小尴尬
gets() 与 scanf() 函数相处呢有点小尴尬的,就是 gets() 在 scanf() 后边就爱捣乱.为什么呢,先了解它们两者之间的异同: 同: 都是可以接受连续的字符数据 并在字符结束后自 ...
- JavaScript闭包函数&箭头函数调用与执行
一.标准的闭包函数 //一.标准的闭包函数 function A() { var i=0; ++i; console.log('i : ' + i); return function b() { re ...
- 本地构建:Gulp
Gulp中文网:https://www.gulpjs.com.cn/ Gulp英文网:https://gulpjs.com/ Gulp:工作流程自动化+强化 (一)安装初始化 (二)基础API及插件 ...
- spring-data-redis HashOperations
spring-data-redis HashOperations /** * 从散列中删除给定的多个元素 * @param key 不能为null 散列的名称 * @param hashKeys 需要 ...
- SR-IOV虚拟机的MTU与物理网卡的MTU
在进行SR-IOV虚拟机MTU方面的测试时,出现如下情况: 1)物理网卡PF的MTU值是4000: root@compute-1:~# ip l|more1: lo: <LOOPBACK,UP, ...
- 『流畅的Python』第15章:上下文管理器和else块
- Regex-Golf
A man, a plan: 判断回文,如果不确定串长度情况下可以考虑利用反向引用构造pattern,例如: (.)\1 , (.)(.)\2\1 , (.)(.)(.)\3\2\1 ...但这里只 ...
- 基于c#的windows基础设计(学习日记2)【关于多态】
这次的多态很简单,没什么知识点 . 直接贴代码了: public abstract class Animal //建立一个抽象类 { private bool m_sex; private strin ...
- 大家多开发点uwp吧
未来一定是平板,笔记本合二为一的市场,微软的应用就是太少了.不过能通用的确实比较爽gest