layout: post

title: ACM中的正则表达式

author: "luowentaoaa"

catalog: true

mathjax: true

tags:

- 正则表达式


总结

正则表达式 , 又称规则表达式 , 英文名为 Regular Expression , 在代码中常简写为 regex , regexp 或 RE , 是计算机科学的一个概念 ; 正则表通常被用来检索 , 替换那些符合某个模式 (规则) 的文本 ;

正则表达式是对字符串 (包括普通字符 , 例如 : a 到 z 之间的字母) 和特殊字符 (称为 “元字符” ) 操作的一种逻辑公式 , 就是用事先定义好的一些特定字符 , 及这些特定字符的组合 , 组成一个 “规则字符串” , 这个 “规则字符串” 用来表达对字符串的一种过滤逻辑 ; 正则表达式是一种文本模式 , 模式描述在搜索文本时要匹配的一个或多个字符串 ;

C++对正则表达式的支持

  1. #include <regex>
  2. using namespace std;

运用规则

  1. 其实运用规则和Java非常相似!!! 几乎可以完全类推!
  2. 附上一些规则:
  3. {n}匹配确定的n
  4. {n,}至少匹配n次(注:请不要擅自加空格上去)
  5. {n,m}最少n次,最多m次.
  6. *匹配前面的子表达式0次或多次 = {0,}
  7. +匹配前面的子表达式1次或多次 = {1,}
  8. ?匹配前面的子表达式1次或两次 = {1,2}
  9. ()表示一个整体
  10. []表示一位
  11. {}表示匹配多少次
  12. .匹配除换行符之外的任意字符
  13. \w匹配单字字符(a-z,A-Z,0-9以及下划线)
  14. \W匹配非单字字符
  15. \s匹配空白字符(空格,制表符,换行符)
  16. \S匹配非空白字符
  17. \d匹配数字字符
  18. \D匹配非数字字符
  19. ^指示从行的开始位置开始匹配(还有声明不在字符集指定范围内)
  20. $指示从行的结束位置开始匹配
  21. \b匹配单词的开始或结束位置
  1. 2.速记理解
  2. . [ ] ^ $四个字符是所有语言都支持的正则表达式,所以这四个是基础的正则表达式。正则难理解因为里面有一个等价的概念,这个概念大大增加了理解难度,让很多初学者看起来会懵,如果把等价都恢复成原始写法,自己书写正则就超级简单了,就像说话一样去写你的正则了:
  3.   等价:
  4. 等价是等同于的意思,表示同样的功能,用不同符号来书写。
  5. ?,*,+,\d,\w 都是等价字符
  6.   ?等价于匹配长度{0,1}
  7.   *等价于匹配长度{0,}
  8.   +等价于匹配长度{1,}
  9.   \d等价于[0-9]
  10. \D等价于[^0-9]
  11.   \w等价于[A-Za-z_0-9]
  12. \W等价于[^A-Za-z_0-9]。
  13. 常用运算符与表达式:
  14.   ^ 开始
  15.   () 域段
  16.   [] 包含,默认是一个字符长度
  17.   [^] 不包含,默认是一个字符长度
  18.   {n,m} 匹配长度
  19.   . 任何单个字符(\. 字符点)
  20.   |
  21.   \ 转义
  22.   $ 结尾
  23.   [A-Z] 26个大写字母
  24.   [a-z] 26个小写字母
  25.   [0-9] 09数字
  26. [A-Za-z0-9] 26个大写字母、26个小写字母和09数字
  27.    分割
  28.   分割语法:
  29.   [A,H,T,W] 包含AHTW字母
  30.   [a,h,t,w] 包含ahtw字母
  31.   [0,3,6,8] 包含0368数字
  32.   语法与释义:
  33.   基础语法 "^([]{})([]{})([]{})$"
  34.   正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束"
  35.   
  36.   ?,*,+,\d,\w 这些都是简写的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)这种特殊组合情况下除外。
  37.   初学者可以忽略?,*,+,\d,\w一些简写标示符,学会了基础使用再按表自己去等价替换
  38.   
  39.   实例:
  40.   字符串;tel:086-0666-88810009999
  41.   原始正则:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"
  42.   速记理解:开始 "tel:普通文本"[0-9数字]{13位}"-普通文本"[0数字][0-9数字]{23位}"-普通文本"[0-9数字]{811位} 结束"
  43.   等价简写后正则写法:"^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$" ,简写语法不是所有语言都支持。

代码中运用实例如下

  1. // 定义一个正则表达式 , 4~23 位数字和字母的组合
  2. regex repPattern("[0-9a-zA-Z]{4,23}",regex_constants::extended);
  3. // 声明匹配结果变量
  4. match_results<string::const_iterator> rerResult;
  5. // 定义待匹配的字符串
  6. string strValue = "123abc";
  7. // 进行匹配
  8. bool bValid = regex_match(strValue, rerResult, repPattern);
  9. if (bValid)
  10. {
  11. // 匹配成功
  12. }

常用的正则表达式

检验数字的表达式
  1. 数字 : ^[0-9]*$
  2. n 位的数字 : ^\d{n}$
  3. 至少 n 位的数字 : ^\d{n,}$
  4. m-n 位的数字 : ^\d{m,n}$
  5. 零和非零开头的数字 : ^(0|[1-9][0-9]*)$
  6. 非零开头的最多带两位小数的数字 : ^([1-9][0-9]*)+(.[0-9]{1,2})?$
  7. 1~2 位小数的正数或负数 : ^(\-)?\d+(\.\d{1,2})?$
  8. 正数 , 负数 , 和小数 : ^(\-|\+)?\d+(\.\d+)?$
  9. 有两位小数的正实数 : ^[0-9]+(.[0-9]{2})?$
  10. 1~3 位小数的正实数 : ^[0-9]+(.[0-9]{1,3})?$
  11. 非零的正整数 : ^[1-9]\d*$ ^([1-9][0-9]*){1,3}$ ^\+?[1-9][0-9]*$
  12. 非零的负整数 : ^\-[1-9][]0-9″*$ ^-[1-9]\d*$
  13. 非负整数 : ^\d+$ ^[1-9]\d*|0$
  14. 非正整数 : ^-[1-9]\d*|0$ ^((-\d+)|(0+))$
  15. 非负浮点数 : ^\d+(\.\d+)?$ ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
  16. 非正浮点数 : ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
  17. 正浮点数 : ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
  18. 负浮点数 : ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
  19. 浮点数 : ^(-?\d+)(\.\d+)?$ ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
检验字符的表达式
  1. 汉字 : ^[\u4e00-\u9fa5]{0,}$
  2. 英文和数字 : ^[A-Za-z0-9]+$ ^[A-Za-z0-9]{4,40}$
  3. 长度为 3~20 的所有字符 : ^.{3,20}$
  4. 26 个英文字母组成的字符串 : ^[A-Za-z]+$
  5. 26 个大写英文字母组成的字符串 : ^[A-Z]+$
  6. 26 个小写英文字母组成的字符串 : ^[a-z]+$
  7. 由数字和 26 个英文字母组成的字符串 : ^[A-Za-z0-9]+$
  8. 由数字 , 26 个英文字母或者下划线组成的字符串 : ^\w+$ ^\w{3,20}$
  9. 中文 , 英文 , 数字包括下划线 : ^[\u4E00-\u9FA5A-Za-z0-9_]+$
  10. 中文 , 英文 , 数字但不包括下划线等符号 : ^[\u4E00-\u9FA5A-Za-z0-9]+$ ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  11. 可以输入含有^%&',;=?$\"等字符 : [^%&',;=?$\x22]+
  12. 禁止输入含有 ~ 的字符 : [^~\x22]+
特殊需求表达式
  1. Email 地址 : ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  2. 域名 : [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  3. InternetURL : [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  4. 手机号码 : ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  5. 电话号码("XXX-XXXXXXX" , "XXXX-XXXXXXXX" , "XXX-XXXXXXX" , "XXX-XXXXXXXX" , "XXXXXXX""XXXXXXXX) : ^($$\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  6. 国内电话号码 (0511-4405222 , 021-87888822) : \d{3}-\d{8}|\d{4}-\d{7}
  7. 身份证号 (15 位 , 18 位数字) : ^\d{15}|\d{18}$
  8. 短身份证号码 (数字 , 字母 x 结尾) : ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
  9. 帐号是否合法(字母开头,允许 5~16 字节,允许字母数字下划线) : ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  10. 密码 (以字母开头,长度在 6~18 之间,只能包含字母 , 数字和下划线) : ^[a-zA-Z]\w{5,17}$
  11. 强密码 (必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8~10 之间) : ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  12. 日期格式 : ^\d{4}-\d{1,2}-\d{1,2}
  13. 一年的 12 个月(01~09和1~12) : ^(0?[1-9]|1[0-2])$
  14. 一个月的 31 天(01~09和1~31) : ^((0?[1-9])|((1|2)[0-9])|30|31)$

A.HihoCoder - 1871 Heshen's Account Book

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define pp pair<int,int>
  5. const ll mod=998244353;
  6. const int maxn=1e6+50;
  7. const ll inf=0x3f3f3f3f3f3f3f3fLL;
  8. int gcd(int a,int b){while(b){int t=a%b;a=b;b=t;}return a;}
  9. int lcm(int a,int b){return a*b/gcd(a,b);}
  10. string s[250];
  11. int tot,n;
  12. string ans[maxn];
  13. int cnt[maxn];
  14. regex str("0|([1-9][0-9]*)");
  15. int main()
  16. {
  17. std::ios::sync_with_stdio(false);
  18. std::cin.tie(0);
  19. std::cout.tie(0);
  20. n=0;
  21. while(getline(cin,s[n]))n++;
  22. tot=0;
  23. for(int i=n-1;i>=1;i--){
  24. while(s[i].size()&&isdigit(s[i][0])&&isdigit(s[i-1].back())){
  25. s[i-1].push_back(s[i][0]);
  26. s[i].erase(0,1);
  27. }
  28. }
  29. for(int i=0;i<n;i++){
  30. stringstream ss;
  31. ss<<s[i];
  32. string now;
  33. while(ss>>now){
  34. if(regex_match(now,str))ans[tot++]=now,cnt[i]++;
  35. }
  36. }
  37. for(int i=0;i<tot;i++){
  38. if(i)cout<<" ";
  39. cout<<ans[i];
  40. }
  41. if(tot)cout<<endl;
  42. for(int i=0;i<n;i++)cout<<cnt[i]<<endl;
  43. return 0;
  44. }

ACM中的正则表达式的更多相关文章

  1. Java在ACM中的应用

    Java在ACM中的应用 —. 在java中的基本头文件(java中叫包) import java.io.*; import java.util.*; //输入Scanner import java. ...

  2. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  3. PHP中有关正则表达式的函数集锦

    之前学正则表达式的目的是想从网上抓取点小说啊,文档啊,还有获取相应的视频连接然后批量下载.当时初学PHP根本不知道PHP有专门抓包的工具,就像Simple_html_dom.php(在我的其他博文中有 ...

  4. JavaScript中的正则表达式(终结篇)

    JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScri ...

  5. Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周 ...

  6. 9.JAVA中的正则表达式

    一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ?          #{0,1}-?有一个-或者没有 \\           #表示一个" ...

  7. Python::re 模块 -- 在Python中使用正则表达式

    前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...

  8. C++ STL泛型编程——在ACM中的运用

    学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应 ...

  9. 关于 矩阵在ACM中的应用

    关于矩阵在ACM中的应用 1.矩阵运算法则 重点说说矩阵与矩阵的乘法,不说加减法. 支持: 结合律  (AB)C = A(BC) 分配律 A(B+C) = AB + AB $\left( \lambd ...

随机推荐

  1. swift中的正则表达式

    swift中的t正则表达式 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串" ...

  2. Pythontutor:可视化代码在内存的执行过程

    http://www.pythontutor.com/visualize.html今天去问开发一个Python浅拷贝的问题,开发给了一个神器,可以可视化代码在内存的执行过程,一看即懂,太NB了!~真是 ...

  3. windows下使用RoboCopy命令进行文件夹增量备份

    RoboCopy,它是一个命令行的目录复制命令,自从Windows NT 4.0 开始就成为windows 资源工具包的一部分,然后在Windows Vista.Windows 7和 Windows ...

  4. python基础实践(三)

    -*-列表是新手可直接使用的最强大的python功能之一,它融合了众多重要的编程概念.-*- # -*- coding:utf-8 -*-# Author:sweeping-monkQuestion_ ...

  5. PAT——甲级1009:Product of Polynomials;乙级1041:考试座位号;乙级1004:成绩排名

    题目 1009 Product of Polynomials (25 point(s)) This time, you are supposed to find A×B where A and B a ...

  6. 洛谷 P4514 上帝造题的七分钟 解题报告

    P4514 上帝造题的七分钟 题目背景 裸体(裸题)就意味着身体(神题). 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n \times m\)矩阵. 第二 ...

  7. 3.1 Java以及Lucene的安装与配置

    Lucene是Java开发的一套用于全文检索和搜索的开源程序库,它面向对象多层封装,提供了一个低耦合.与平台无关的.可进行二次开发的全文检索引擎架构,是这几年最受欢迎的信息检索程序库[1].对Luce ...

  8. 封装removeClass()

    <div class="box haha xixi">123</div> <script> function removeClass(eleme ...

  9. C/C++ 运算符 & | 运算

    C/C++中的“按位或 规则: 1|1=1 1|0=1 0|1=1 0|0=0 按位或运算 按位或运算符“|”是双目运算符.其功能是参与运算的两数各对应的二进位(也就是最后一位)相或.只要对应的二个二 ...

  10. 微信设置URL之WebApi方式

    微信公众号开发者设置里的URL,现在采用WebAPI的方式,结果一直报“未能正确设置Token”的错误,采用Handler和MVC的方式倒是可以. 解决步骤一,添加服务器IP到白名单. 解决步骤二,确 ...