输入有多组数据。 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。
输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。
4 Aab a2B ab ABB a[a2b]b
1 Aab 2 a2B 4 ABB
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 10005
char s[maxn][maxn], t[maxn];
int n;
int equal(char c1, char c2){
if(c1 >= 'a' && c1 <= 'z'){
if(c2 >= 'A' && c2 <= 'Z') c2 = 'a' + (c2 - 'A');
return c1 == c2 ? 1 : 0;
}
else if(c1 >= 'A' && c1 <= 'Z'){
if(c2 >= 'a' && c2 <= 'z') c2 = 'A' + (c2 - 'a');
return c1 == c2 ? 1 : 0;
}
else{
return c1 == c2 ? 1 : 0;
}
}
int ck(char _s[], char _c, int l, int r){
int i;
for(i = l + 1; i < r; i++){
if(equal(_c, _s[i]) == 1){
return 1;
}
}
return 0;
}
int judge(char _s[], char _t[]){
int i = 0, j = 0;
int ls = strlen(_s), lt = strlen(_t);
while(i < ls && j < lt){
if(_t[j] == '['){
int l = j;
int r = l;
for(;;r++){
if(_t[r] == ']') break;
}
if(ck(_t, _s[i], l, r) == 1){
i++; j = r + 1;
}
else{
return 0;
}
}
else{
if(equal(_s[i], _t[j]) == 1){
i++; j++;
}
else{
return 0;
}
}
}
if(i == ls && j == lt) return 1;
else return 0;
}
int main()
{
int i;
while(~scanf("%d", &n)){
for(i = 0; i < n; i++){
scanf("%s", s[i]);
}
scanf("%s", t);
for(i = 0; i < n; i++){
if(judge(s[i], t) == 1){
printf("%d %s\n", i + 1, s[i]);
}
}
}
return 0;
} import sys import re line = sys.stdin.readline() while line: ss = [] for _ in range(int(line)): ss.append(raw_input()) patt = raw_input() for i,s in enumerate(ss): m = re.search(patt, s, re.I) if m is not None: print i + 1, s line = sys.stdin.readline()
#include"iostream"
#include"vector"
using namespace std;
int main(){
int n;
while(cin>> n){
getchar();
vector<string> v(n+ 1);
for(int k= 1; k<= n; k++){ getline(cin, v[k]);}// 输入数据串
string mode;cin>> mode;// 输入模式串
int len2= mode.length();
for(int k= 0; k< len2; k++){ mode[k]= tolower(mode[k]);}// 不区分大小写 模式串全部转小写
for(int k= 1; k<= n; k++){
int len, i, j2;
i= j2= 0, len= v[k].length();// 双指针
while(i< len&& j2< len2){
if(mode[j2]== '['){// 模式串遇到[
int loc= mode.find(']', j2+ 1);// 确定]的位置
int xb= mode.find(tolower(v[k][i]), j2+ 1);// 在[、]之间寻找数据串的字符
if(xb< loc&& xb> j2){i++; j2= loc+ 1;}// 如果在模式串[、]之间有数据串的字符 数据串指针后移一位 模式串指针移动到]后
else{break;}//
}else if(tolower(v[k][i])== mode[j2]){// 模式串非[ 则与主串字符比较 若相同 双指针后移
i++;j2++;
}else{break;}// 否则匹配失败
}
if(j2== len2){cout<< k<< " "<< v[k]<< endl;}
}
}
} #include<iostream>
#include<regex>//正则表达式头文件
using namespace std;
//建议正则表达式来做,参考资料
//https://www.cnblogs.com/sgdd123/p/7778599.html
int main(void)
{
int n;
string s[1000];
while(cin >> n)
{
for(int i = 0;i < n;i++)
{
string temp;
cin >> temp;
s[i] = temp;
}
string s_match;
cin >> s_match;
regex r(s_match,regex::icase);//正则表达式的声明,regex::icase 不区分大小写
for(int i = 0;i < n;i++)
{
string temp = s[i];
if(regex_match(temp,r))//regex_match完全匹配;不完全匹配用regex_search
cout << i + 1 << ' ' << temp << endl;
}
}
return 0;
} #include<iostream>
#include<string>
using namespace std;
void ToLower(string &pattern)
{
for(int j = 0;j < pattern.size();j++)
{
if(pattern[j] >= 'A' && pattern[j] <= 'Z')
{
pattern[j] = char(pattern[j] + 32);
}
}
}
int main()
{
int n;
string pattern;
while(cin >> n)
{
string s[n],p[n];
for(int i = 0;i < n;i++)
{
cin >> s[i];
p[i] = s[i];
ToLower(s[i]);
}
cin >> pattern;
ToLower(pattern);
for(int i = 0;i < n;i++)
{
int j = 0,k = 0;
while(j < s[i].size() && k < pattern.size())
{
bool flag = false;
if(pattern[k] == '[')
{
k++;
while(pattern[k] != ']')
{
if(pattern[k] == s[i][j])
{
flag = true;
}
k++;
}
if(!flag){
break;
}
else
{
k++;
j++;
}
}
else if(s[i][j] == pattern[k])
{
j++;
k++;
}
else
{
break;
}
}
if(j == s[i].size() && k == pattern.size())
{
cout << i + 1 << " " << p[i] << endl;
}
}
}
} #include<iostream>
#include<queue>
using namespace std;
int main(){
int n;
while(cin>>n){
string str[n],str1[n],_str;
bool show[n];
for(int i = 0; i<n; i++){
show[i] =false;
cin>>str[i]; //用于输出
str1[i] = str[i]; //所有大小写统一,用于比较
int l = str[i].size();
for(int j = 0; j<l; j++)
if(str1[i][j]>='A' && str1[i][j] <= 'Z')
str1[i][j] = str1[i][j] + 'a' - 'A';
}
cin>>_str;
int len = _str.size();
for(int j = 0; j<len; j++)
if(_str[j]>='A' && _str[j]<= 'Z')
_str[j] = _str[j] + 'a' - 'A'; //统一大小写
int pos1 = 0,pos2;
queue<string> kmp; //创建队列用于存放要匹配字符串
kmp.push(_str);
while(!kmp.empty()){ //去除所有【】,并将所有可能入队
string a = kmp.front();
if(a.find('[') == string::npos)
break;
else{
kmp.pop();
pos1 = a.find('[');
pos2 = a.find(']');
for(int i = pos1+1; i<pos2; i++){
string _str1 = a.substr(0,pos1) + a[i] + a.substr(pos2+1);
kmp.push(_str1);
}
}
}
while(!kmp.empty()){ //比较
string a = kmp.front();
kmp.pop();
for(int j = 0; j<n; j++){
if(show[j] == false){
if(str1[j].find(a) != string::npos)
show[j] = true;
}
}
}
for(int j = 0; j<n; j++)
if(show[j] == true) //输出
cout<<j+1<<" "<<str[j]<<endl;
}
} import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int n = scanner.nextInt();
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < n; i++) list.add(scanner.next());
String r = scanner.next().toLowerCase();
for (int i = 0; i < list.size(); i++) {
if (Pattern.matches(r,list.get(i).toLowerCase()))
System.out.println(i+1+" "+list.get(i));
}
}
}
} #include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
string str[n],cmp[100],org;
for(int i=0;i<n;cin>>str[i++]);
cin>>org;
int be,en,olen;
int num=0;
while((be=org.find('['))!=-1)
{
en=org.find(']');
cmp[num++]=org.substr(be,en);
org.replace(be,en-be+1,"*");
}
olen=org.length();
for(int i=0;i<n;i++)
{
num=0;
if(str[i].length()!=olen) continue;
for(int j=0;j<olen;j++)
{
char c = str[i][j];
char d = tolower(c);
char e = toupper(c);
if(org[j]=='*'){
if(cmp[num].find(d)==-1&&cmp[num].find(e)==-1&&c!='*') break;
num++;
}
else if(tolower(org[j])!= d) break;
if(j+1==olen) cout<<i+1<<' '<<str[i]<<endl;
}
}
}
return 0;
}
#include<iostream>
#include<string.h>
using namespace std;
string str[1000];
int main(){
int n;
string s;//待比较模式串
while(cin>>n){
for(int i=0;i<n;i++) cin>>str[i];
cin>>s;
int length=s.size();
int real=0;//待比较模式串真正意义的长度
bool mark=false;
for(int i=0;i<length;i++){//求出real
if(s[i]!='['&&mark==false){
real++;
}
else{
mark=true;
if(s[i]!=']')
continue;
else{
mark=false;
real++;
}
}
}
int differ='A'-'a';
for(int i=0;i<n;i++){
bool flag=false;
if(str[i].size()!=real) continue;
else{
for(int j=0,t=0;j<real;j++,t++){
if(str[i][j]==s[t]||str[i][j]-s[t]==differ||s[t]-str[i][j]==differ){
flag=true;
continue;//字符匹配 进入下一位置循环
}
else{
if(s[t]=='['){//字符不匹配 且该位置是'[',在[]中搜索 检验是否匹配
for(;s[t]!=']';t++){
if(str[i][j]==s[t]||str[i][j]-s[t]==differ||s[t]-str[i][j]==differ){
flag=true;
}
}
}
else{//字符不匹配 且该位置不是'[',直接跳出循环 匹配失败
flag=false;
break;
}
}
}
}
if(flag) cout<<i+1<<" "<<str[i]<<endl;
}
}
return 0;
}
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt())
{
int n = sc.nextInt();
List<String> list = new ArrayList<>();
while(n-- != 0)
list.add(sc.next());
String pattern = sc.next().toLowerCase();
for(int i = 1; i <= list.size(); i++)
{
String current = list.get(i - 1);
if(current.toLowerCase().matches(pattern))
System.out.println(i + " " + current);
}
}
sc.close();
}
}
C语言AC#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
int n=1;
while(cin>>n){
string str[n];
for(int i=0;i<n;i++){
cin>>str[i];
}
string parten;
cin>>parten;
int count=0;
int lcount = 0;
// 得到模式串的长度
for(int i =0;i<parten.size();i++){
if(parten[i]!='[')
lcount++;
else{
while(parten[i]!=']')
i++;
lcount++;
}
}
for(int i=0;i<n;i++){
count = 0;
int k=0;
// cout<<endl<<str[i]<<endl;
for(int j=0;j<str[i].size();j++){
if(parten[k] != '['){
// lcount++;
string left="";
left+=(str[i][j]);
string right="";
right += parten[k];
// cout<<endl<<"str[i][j] "<<str[i][j]<<" partten[k] "<<parten[k]<<" stricmp "<<stricmp(left.c_str(),right.c_str())<<endl;
if(strcasecmp(left.c_str(),right.c_str()) != 0)
break;
else
count++;
}else{
k++;
// lcount++;
while(parten[k]!=']'){
string left="";
left+=(str[i][j]);
string right="";
right += parten[k];
if(strcasecmp(left.c_str(),right.c_str()) == 0)
{
count++;
while(parten[k]!=']')
k++;
}else
{
k++;
}
}
}
k++;
//cout<<endl<<"after] : "<<parten[k];
// cout<<k<<endl;
}
// cout<<endl<<"lcount"<<lcount<<endl;
if(count == str[i].size()&&count == lcount)
cout<<i+1<<" "<<str[i]<<endl;
else
continue;
}
//cout<<endl<<"END";
}
}
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
char pat[1000];
char str[1000][1000];
int n;
while(scanf("%d",&n)!=EOF)//EOF或-1终止
{
getchar();
for(int i=0; i<n; i++)
{
gets(str[i]);
}
gets(pat);
int l='A'-'a';
bool tag=false;
int v=0;
for(int i=0; i<strlen(pat); i++)
{
if(pat[i]>='A'&&pat[i]<='Z')
pat[i]-=l;
if(pat[i]=='[')
tag=true;
if(pat[i]==']')
tag=false;
if(tag==true)
v++;
}
int plen=strlen(pat)-v;
for(int i=0; i<n; i++)
{
int len=strlen(str[i]);
if(len!=plen)
continue;
bool flag=true;
int offset=0;
int t=0;
for(int j=0; j<len; j++,t++)
{
if(str[i][j]!=pat[t]&&str[i][j]!=pat[t]+l)
{
flag=false;
if(pat[t]=='[')
{
bool fl=false;
for(; pat[t]!=']'; t++)
{
if(str[i][j]==pat[t]||str[i][j]==pat[t]+l)
fl=true;
}
if(fl)
flag=true;
}
else
{
flag=false;
break;
}
}
}
if(flag)
printf("%d %s\n",i+1,str[i]);
}
}
return 0;
}
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int n;
vector<string> vs;
while (cin >> n) {
vs.clear();
for (int i=0; i<n; i++) {
string s;
cin >> s;
vs.push_back(s);
}
string s;
cin >> s;
for (int i=0; i<n; i++) {
int j1 = 0;
int j2 = 0;
string s2(vs[i]);
while (true) {
if (j1 < s.size() && j2 == s2.size()
|| j1 == s.size() && j2 < s2.size()) {
break;
}
if (j1 == s.size() && j2 == s2.size()) {
cout << (i + 1) << ' ' << s2 << endl;
break;
}
if (s[j1] == '[') {
bool flag = false;
while (s[++j1] != ']') {
if ((s[j1] | 32) == (s2[j2] | 32)) {
flag = true;
}
}
if (!flag) {
break;
}
j1++;
j2++;
}
else {
if ((s[j1] | 32) == (s2[j2] | 32)) {
j1++;
j2++;
}
else {
break;
}
}
}
}
}
}
#include <stdio.h>
#include <string.h>
#define N 1001
#define LEN 1001
int IsLetter(char c)//判断一个字符是不是字母、大写还是小写
{
if('a'<=c&&c<='z') return 1;
else if('A'<=c&&c<='Z') return 1;
else return 0;
//返回2表示大写,返回1表示小写,返回0表示不是字母
}
int IsSame(char a, char b)//判断两个字符是否一致,不区分大小写
{
if(IsLetter(a)==0||IsLetter(b)==0)//若ab有一个不是字母,那就严格匹配
{
if(a==b) return 1;
else return 0;
}
else//若ab都是字母
{
if(a==b) return 1;
else if(a==b+'A'-'a') return 1;
else if(a==b+'a'-'A') return 1;
else return 0;
}
}
int Bracket(char s[], char b[], int &pos_s, int &pos_b)//对比括号内的内容
{
int i=pos_b+1;//指向'['之后的位置,准备开工
while(b[pos_b]!=']') pos_b++;//找到']'
pos_b++;//b的指针指向']'之后
while(i<pos_b-1)
{
if(IsSame(b[i], s[pos_s]))
{
pos_s++;
return 1;
}
i++;
}
return 0;
}
int MatchWith(char s[], char b[])//判断两个串是否匹配
{
int ls=strlen(s), lb=strlen(b);
int pos_s=0, pos_b=0;
while(pos_s<ls&&pos_b<lb)
{
if(IsSame(b[pos_b], s[pos_s]))
{
pos_s++;
pos_b++;
}
else if(b[pos_b]=='[')//准备处理括号
{
if(!Bracket(s, b, pos_s, pos_b)) break;
//若括号内匹配失败,则跳出循环(也会顺便返回0)
}
else return 0;
}
if(s[pos_s]=='\0'&&b[pos_b]=='\0') return 1;//两串同时结束才算匹配
else return 0;
}
int main()
{
int i, n;
char s[N][LEN];//大约占1MB空间,问题不大
char b[LEN];
while(scanf("%d", &n)!=EOF)
{
for(i=0; i<n; i++) scanf("%s", s[i]);
scanf("%s", b);
for(i=0; i<n; i++)
{
if(MatchWith(s[i], b)) printf("%d %s\n", i+1, s[i]);
}
}
return 0;//大功告成
} #include <cstdio>
#include <iostream>
#include <string>
#include <regex>
using namespace std;
string st[1001];
int main () {
int n;
scanf("%d ", &n);
for (int i=1; i<=n; ++i)
getline(cin, st[i]);
getline(cin, st[0]);
regex r(st[0], regex::icase); // regex::icase 不区分大小写
for (int i=1; i<=n; ++i)
if (regex_match(st[i], r)) // 这是完全匹配,部分匹配用regex_search
cout << i << ' ' << st[i] << endl;
} #include<iostream>
#include<string>
using namespace std;
bool equal(char a, char b) //判等函数
{
if(isalpha(a)&&isalpha(b)) //若a、b同为字母,判断两者的小写是否相等
return tolower(a) == tolower(b); //实测,tolower在已是小写时不操作
else return a == b; //否则判其是否严格相等
}
int main()
{
int n;
while (scanf("%d\n", &n) != EOF) { //多组输入
string text[1005], pattern;
for (int i = 0; i < n; cin >> text[i++]);
cin >> pattern; //输入文本串、模式串
for (int i = 0; i < n; i++) {
bool match = true;
int j = 0, k = 0; //双指针指向两者位置
for (; j < pattern.size()&&k < text[i].size();j++,k++) {
if (pattern[j] == '[') { //遇到'['则单独扫描j
bool hit = false;
while (++j<pattern.size() && pattern[j] != ']') {
if (equal(text[i][k], pattern[j]))
hit = true; // j退出循环时已经与k同步
}
if (!hit) { //扫描'[]'内字符后仍无法匹配则跳出
match = false;
break;
}
}
else if (!equal(text[i][k], pattern[j])) { //匹配失败跳出
match = false;
break;
}
}
if (j != pattern.size() || k != text[i].size()) match = false;
//匹配成功则必然j、k都到上限,这一步是防止包含情况出现,如ab,A[a2b]b
if(match) cout << i + 1 << " " << text[i] << endl;
}
}
return 0;
} #include<iostream>
(720)#include<algorithm>
#include<string>
(765)#include<map>
#include<vector>
(721)#include<iomanip>
#include<regex>
using namespace std;
int main()
{
string s;
int n;
while (cin>>n)
{
vector<string> con;
for (int i = 0; i < n; i++)
{
cin >> s;
con.push_back(s);
}
string pa;
cin >> pa; //正则匹配表达式,文法
//int a = pa.find('[');
//int b = pa.find(']');
//string i = pa.substr(0, a);
//string j = pa.substr(a, b - a + 1);
//string k = pa.substr(b + 1, pa.size() - b - 1);
regex pattern(pa,regex::icase); //不区分大小写匹配
smatch result;
for (int i = 0; i < con.size(); i++)
{
if(regex_match(con[i], result, pattern))
cout << i + 1 << " "<<con[i] << endl;
}
}
}