Linux&MySQL 正则表达式

来源:互联网 发布:我国的顶级域名 编辑:程序博客网 时间:2024/06/06 13:55

Linux 和 MySQL中的正则表达式是不一样的,特别容易混,以下分别记录Linux和MySQL的正则表达式的规则。

1.Linux shell 脚本的正则表达式:

————————————————————————————————————

先区分两个概念:

Linux中正则表达式与通配符:

@ 通配符用来​匹配系统中符合条件的文件名,是完全匹配。ls,find,cp这些命令是支持通配符匹配的。

    通配符有三种:*,?,[]

   例: find /root/tmp -name ​zh*

           find /root/tmp -name zh???

           find /root/tmp -name zh[abc]​

@ 正则表达式用来在文件中匹配符合条件的字符串​,是包含匹配。grep,awk,sed等命令可以支持正则表达式。

————————————————————————————————————​

基本的正则表达式:​

(1)“ * ”:前一个字符匹配0次,或任意多次 ​,例:

 grep "a*" test​_rule.txt            #匹配所有内容,包括空白行

 grep "a**"​ test_rule.txt          #匹配至少包含有一个a的行

 grep "aaa*" test_rule.txt        #匹配至少包含有两个a的行

 grep "aaaaa*" test_rule.txt    #匹配至少包含有四个a的行​

(2)​“ . ”:匹配除了换行符外任意任意一个字符,例:

 grep "s..d"​ test_rule.txt         #"s..d"会匹配在s和d这两个字母之间有两个字符的单词

 grep "s.*d" test_rule.txt        #匹配在s和d之间有任意字符的​单词

 grep ".*" test_rule.txt            #匹配​所有内容

(3)“^”:匹配行首;“$”:匹配行尾,例:

 grep "^M" test_rule.txt        #匹配以大写字母M开头的行

 grep "n$" test_rule.txt          #匹配以小写字母n结尾的行

 grep -n "^$" test_rule.txt ​    #匹配空白行

(4)“[]”:匹配中括号中指定的任意一个字符,只匹配一个字符,例:

 grep "s[ao]id" test_rule​.txt    #匹配含有said或soid的行

 grep "[0-9]" test_rule.txt       #匹配含有数字的行

 grep "^[a-z]" test_rule.txt​     #匹配以小写字母开头的行

(5) “[^]”:匹配除中括号的字符以外的任意一个字符​,例:

 grep "^[^a-z]" test_rule.txt   #匹配​不用小写字母开头的行

 grep "^[^a-zA-Z]" test_rule.txt #匹配不用字母开头的行​

(6) “\”:转义字符,例:

 grep "\.$" test_rule.txt           #匹配以"."结尾的行

(7)“\{n\}”:表示其前面的字符恰好出现n次,例:

 grep "a\{3\}" test_rule.txt      #匹配a字母连续出现三次的字符串

 grep "[0-9]\{3\}" test_rule.txt  #匹配包含连续三个数字的字符串

(8)“\{n,\}”:表示其前面的字符至少出现n次,例:

 grep "^[0-9]\{3,\}" test_rule.txt   #匹配最少用三个数字开头的行​

(9)“\{n,m\}”​:匹配其前面的字符至少出现n次,最多出现m次,例:

 grep "sa\{1,3\}i" test_rule.txt​         #匹配在字母s和i之间至少有1个a,最多有3个a


2.MySQL的正则表达式

————————————————————————————————————

先要知道like的用法,like用来进行模糊匹配,常用的通配符有:"_"和"%"。

“_”:匹配单个字符

“%”:匹配0个或多个字符​

假设现有如下数据库表(mem_info)

                   name        id        gender

                   wang​​         1            1

                   wan           2            2

                   zhang​        3            1

select * from ​mem_info where name like "wan_"         #查询出第1行数据

select * from ​mem_info where name like "%ang"        #查询出第1和第3行

select * from mem_info where name like "_a%"​           #查询出第1和第2行

————————————————————————————————————​

(1)     ^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。

(2)     $

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。

(3)     .

匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。

(4)     [...]

字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

(5)     [^...]

负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

(6)     p1|p2|p3

匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

(7)     *

匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

(8)     +

匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

(9)     {n}

n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

(10)   {n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。


例:​

查找name字段中以'st'为开头的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP'^st';

查找name字段中以'ok'为结尾的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP'ok$';

查找name字段中包含'mar'字符串的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP'mar';

查找name字段中以元音字符开头且以'ok'字符串结尾的所有数据:

SELECT name FROM person_tbl WHERE name REGEXP'^[aeiou]|ok$';