XxBlog

knowledge is power

我叫潘潘,来自成都,是一名 Java,Python 开发者,爱好广泛,热爱各种新技术,致力成为一名全栈开发工程师。


正则表达式初学

  • 什么是正则表达式

    正则表达式是通过一些特殊的符号,使用户可以轻松快捷的完成查找、删除、替换等处理程序。正规表示法基本上是一种『表示法』, 只要工具程序支持这种表示法,那么该工具程序就可以用来作为正规表示法的字符串处理之用。

  • 正则表达式的特殊符号

    [:alnum:]代表英文大小写字母及数字
    [:alpha:]代表英文大小写字母
    [:blank:]代表空格和 tab 键
    [:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL
    [:digit:]代表数字
    [:graph:]代表空白字符以外的其他
    [:lower:]小写字母
    [:print:]可以被打印出来的任何字符
    [:punct:]代表标点符号
    [:upper:]代表大写字符
    [:space:]任何会产生空白的字符如空格,tab,CR 等
    [:xdigit:]代表 16 进位的数字类型

    实例: 新建一个文本文档1.txt,填充一些字符串

    1. 使用grep查找文档中所有的小写字母

       grep -n '[[:lower:]]' 1.txt
      
    2. 使用grep查找文档中所有的数子

       grep -n '[[:digit:]]' 1.txt
      
  • 注意:语系对正则表达式的影响
    由于不同语系的编码数据不同,所以造成不同语系的数据选取结果有所差异。以英文大小写为例,zh_CN.big5 及 C 这两种语系差异如下:

    • LANG=C 时: 0 1 2 3 4….ABCDE…Zabcde…z
    • LANG=zh_CN 时:0 1 2 3 4…aAbBcCdD…..zZ

    在使用正则表达式[A-Z]时, LANG=C 的情况下,找到的仅仅是大写字符 ABCD..Z。而在 LANG=zh_CN 情况下,会选取到 AbBcCdD…..zZ 字符。因此在使用正则表达式时要特别留意语系。

    由于我们一般使用的兼容与 POSIX 的标准,因此使用 C 语系。

字符组匹配

  • []字符组支持由连字符’-‘来表示一个范围,当’-‘前后构成范围时,要求前面字符的码位小于后面字符的码位。
  • [^…] 排除型字符组。排除后面的字符。

    [abc] :表示“a”或“b”或“c”
    [0-9] :表示 0~9 中任意一个数字,等价于[0123456789]
    [\u4e00-\u9fa5] :表示任意一个汉字
    [^a1<] :表示除“a”、“1”、“<”外的其它任意一个字符
    [^a-z] :表示除小写字母外的任意一个字符

    实例: 查找’tast‘或者’test‘两个字符串

      grep -n 't[ae]st' 1.txt
    
  • 行首符^与行尾符$
    • 如果想要查找行首为’the‘的字符行

        grep -n '^the' 1.txt   查找行首为大写字母的所有行:   * '^[A-Z]' 表示以大写字母开头。   * '[^A-Z]' 表示除了大写字母 A-Z 的所有字符。
      
    • 如果想要查找以字母’d‘结尾的字符行

        grep -n 'd$' 1.txt
      
    • 查找空行

        grep -n '^$' 1.txt
      
  • 任意一个字符’.’与重复字符’*’
    .类似于查找中的通配符?
    *等同于查找中的通配符*
    • 查找a?ou?类型的字符

        grep -n 'a.ou.' 1.txt
      

    *:代表重复前面 0 个或者多个字符。
    e*: 表示具有空字符或者一个以上 e 字符。
    ee*,表示前面的第一个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。
    eee*,表示前面两个 e 字符必须存在。第三个 e 则可以是 0 个或者多个 e 字符。
    ee*e :表示前面的第一个与第三个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。

  • 限定连续字符范围{}
    { }可限制一个范围区间内的重复字符数。举个例子,若要找出 2~5 个 o 的连续字符串,如何做?

      'o{2,5}'   查找 g 后面接 2 到 5 个 o,然后再接 g 的字符串
    	
      'go{2,5}g'
    

    总结:

    ^word 表示带搜寻的字符串(word)在行首
    word$ 表示带搜寻的字符串(word)在行尾
    .(小数点) 表示 1 个任意字符
    \ 表示转义字符,在特殊字符前加\会将特殊字符意义去除
    * 表示重复 0 到无穷多个前一个 RE(正则表达式)字符
    [list] 表示搜索含有 list 的字符串
    [n1-n2] 表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等 [^list] 表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围
    {n,m} 表示找出 n 到 m 个前一个 RE 字符
    {n,} 表示 n 个以上的前一个 RE 字符

最近的文章

GIT高级使用攻略

提交修改过的文件 添加所有修改和删除的文件到暂存区,不包含新建的文件 git add -u 添加所有的文件到暂存区 git add . git add -A . git add --all 提交代码 git commit -m "Description" 删除一个已提交的文件 git rm file.name git commit -m "remove file" 添加.gitig...…

Git继续阅读
更早的文章

Tomcat配置Https证书

###Tomcat配置Https证书最近做项目的时候时候用到了Paypal支付,目前Paypal推荐使用RESTapi来发起支付,支付之后Paypal服务器会异步回调发起方的服务器,需要在Paypal Developer里面的DASHBOARD中配置WEBHOOKS地址,也就是回调地址,蛋疼的地方来了,Paypal的回调接口地址必须使用Https开头,(国内的支付宝都可以使用http,真是蛋疼,或许这些地方就是Paypal在国内火不起来的一部分原因吧。)好了,废话不多说了,开始操作步骤:#...…

继续阅读