正则表达式

一. 特殊符号的含义
  1. 量词

    • *:表示前面的模式零次或多次
    • +:表示前面的模式一次或多次
    • ?:表示前面的模式零次或一次
    • {n}:表示前面的模式恰好 n 次
    • {n,}:表示前面的模式至少 n 次
    • {n,m}:表示前面的模式至少 n 次且不超过 m 次
  2. 分组和捕获

    • ( ):用于分组和捕获子表达式
    • (?: ):用于分组但不捕获子表达式
  3. 特殊字符

    • \:转义字符,用于表示特殊字符本身
    • .:表示任意字符(除了换行符\r\n)
    • |:用于指定多个模式的选择
  4. 锚点

    • ^表示字串开头
    • $表示字串结尾
    • \b表示一个单词的边界,即字与空格间的位置
    • \B表示非单词的边界
  5. 字符类

    • [ ]:表示括号内的任意一个字符。例如,`[abc]`` 表示字符 "a"、"b" 或 "c"
    • [^ ]:表示除了括号内的字符以外的任意一个字符。例如,[^abc] 表示除了字符 "a"、"b" 或 "c" 以外的任意字符
    • \w:表示一个字符,该字符是字母,数字,下划线. 等价于[A-Za-z0-9_]
    • \d:表示一个阿拉伯数字. 等价于[0-9]
    • \D: 匹配一个非数字字符。等价于 [^0-9]
    • \s: 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]
    • \S: 匹配任何非空白字符。等价于 [^\f\n\r\t\v]

eg: ^[0-9].*[abc]$ 表示"以数字开头,以a或b或c结尾的字串"
[^aeiou]表示字串中,所有不是aeiou的字符
([1-9])([a-z])

二. 正则表达式可以干什么
  1. 测试字符串是否满足正则表达的某个格式
  2. 替换正则表示到的文本
  3. 从字串中提取正则表示的子字符串
三. 定位查询

前面讲了, ( )用于匹配后捕获字串的. 但如果( )里是以下面这4个符号?=、?!、?<=、?<!开头,则表示以括号内的内容作为定位

  1. exp1(?=exp2): 以 exp2 为定位, 匹配 exp2 前面的 exp1
    runoob(?=[\d]+) : 匹配后面是数字的 runoob

  2. exp1(?!exp2): 匹配 exp1, 但不要在 exp2 之前
    runoob(?![\d]+) : 匹配后面不是数字的 runoob

  3. (?<=exp2)exp1: 匹配 exp2 后面的 exp1
    (?<=[\d]+)runoob: 匹配前面是数字的 runoob

  4. (?<!exp2)exp1: 匹配 exp1, 但不要在 exp2 后面
    (?<![\d]+)runoob: p匹配前面不是数字的 runoob

四. 反向引用

()匹配到的内容,会被正则引擎放到缓冲区中.缓冲区编号从1开始,最大到99.如果想引用前面缓冲区匹配到的内容, 用 \n 表示即可. 比如 \1 表示第一个缓冲区匹配到的内容.反向引用的最简单的、最有用的应用之一,是匹配出文本中两个相同的相邻单词字串.
eg: 匹配 'Is is the cost of of gasoline going up up' 字串中相同的连续字串.

eg: 用这则表达式判断一个数是否是素数

首先, 把整数 n 写成 n 个 1. 比如,数字 13 写成 1111111111111. 则表达式中的1+表示至少一个1,所以11+表示2个以上的1. \1表示(11+)匹配到的串,这样(11+)\1表示能被2整除. 后面加上'+'就能表示能被3以上整除了

五. shell 脚本中的正则

shell 中使用正则匹配, 用 grep -E 匹配. 但 grep 不能很好的支持抓取分组结果. 本想用 sed , 但发现懒惰匹配模式貌似不支持, 改用 perl -pe 获取分组结果.

shell 复制代码
# 取 url 参数在1002,2002,90553 中任意一个,切后面有 oaid 参数的报文
# perl -pe 抓取 oaid 参数值:  \1 取第一个分组
# grep -v '^$' 去掉空行
oaid=`hdfs dfs -text $fileName | grep -E 'url=(1002|2002|90553).*&oaid=(.*?)&.*' | perl -pe 's/.*&oaid=(.*?)&.*/\1/g' | grep -v '^$' | head -1`
echo "oaid: $oaid"
相关推荐
问道飞鱼13 小时前
【知识科普】认识正则表达式
数据库·mysql·正则表达式
我码玄黄19 小时前
正则表达式优化之算法和效率优化
前端·javascript·算法·正则表达式
Java编程乐园1 天前
Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】
java·正则表达式
好学近乎知o1 天前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
SunnyRivers3 天前
基础爬虫案例实战
正则表达式·爬虫实战·多进程·requests
西洼工作室4 天前
【java 正则表达式 笔记】
java·笔记·正则表达式
kiss strong5 天前
正则表达式
正则表达式
Linux运维技术栈5 天前
Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作
开发语言·python·正则表达式
jackiendsc5 天前
Java中正则表达式的介绍、使用场景及示例代码
java·开发语言·正则表达式
taller_20005 天前
VBA之正则表达式(48)-- 快速拆分中文语句
正则表达式·正则·拆分中文·中文拆分·中文标点