正則表達式基本使用方法简单介绍

正則表達式非常实用, 有些书专门用整本书来讲这个, 可见其博大精深。 有人的地方就有江湖。 有字符串的地方就有正則表達式。所谓的正則表達式, 只是是一种模式/形式罢了。 说白了, 就是一个字符串形式。 没那么玄乎其玄。

我们之前介绍过的grep, sed和awk是一种文本/字符串处理工具。 而正則表達式却不同。 它仅仅是一种字符串形式。 我们能够用grep, sed和awk对正則表達式进行处理。 为了方便集中介绍正則表達式, 我们用最简单的grep来做处理工具。

正則表達式也不同于通配符。 虽然也有类似的地方。

在正則表達式中的*和通配符中的*就不是一个意思, 这一点务必引起重视。

除了主要的正則表達式外, 实际上还有扩展的正則表達式。 比方+, ?, ()等东东。 此时我们要用egrep或者grep -E, 在本文中, 我们用egrep.

以实践操作为荣, 以只看不练为耻。

在本文中,我们只进行基本介绍, 兴许有新东西加入到本博客中, 我们一起来玩玩吧:

       1. ^xxx表示以xxx開始的行, 例如以下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep ^go test.txt
good good study

[email protected] ~/reg
$

       2. xxx$表示以xxx结尾的行。 例如以下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep up$ test.txt
daydayup

[email protected] ~/reg
$

顺便说一下, ^$能够表示空行, 这个显而易见。

       3. 点表示除了换行符之外的随意一个字符, 例如以下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep d.y test.txt
daydayup

[email protected] ~/reg
$

再来看一个错误的使用方法:

[email protected] ~/reg
$ echo "w.x.y.z" | grep "w.x"
w.x.y.z

[email protected] ~/reg
$

结果尽管侥幸正确。 但这不过碰巧而已。 不信。 请看:

[email protected] ~/reg
$ echo "w_x_y_z" | grep "w.x"
w_x_y_z

[email protected] ~/reg
$

为什么过滤w.x的时候, 却把w_x_y_z过滤出来了呢? 原来, 在正則表達式中。 点不再是普通的点了。 点表示的是换行符之外的随意一个字符。

但倘若我们就是要过滤w.x这个串, 怎么办呢? 那就必需要用到\来转义了, 我们即将会介绍。 先来热热身:

[email protected] ~/reg
$ echo "www.x.y.z" | grep "w\.x"
www.x.y.z

[email protected] ~/reg
$ echo "w_x_y_z" | grep "w\.x"

[email protected] ~/reg
$

这就对了。

      4. *表示前面模式的0次或者多次反复, 例如以下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep d.*y test.txt
good good study
daydayup

[email protected] ~/reg
$ grep s.*t test.txt
good good study

[email protected] ~/reg
$ grep s.t test.txt

[email protected] ~/reg

比方注意。 s.t并无法过滤出相应的行。 而s.*t却能够, 由于.*表示0个或者多个字符。

       5. []用来指定一个字符所述的集合, 要注意,[]仅仅会匹配当中的某个字符, 例如以下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep s[rst]u test.txt
good good study

[email protected] ~/reg
$ grep s[abc]u test.txt

[email protected] ~/reg
$

假设要表示全部的英文字母。 那该用如何的集合呢? 例如以下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep s[a-zA-Z]u test.txt
good good study

[email protected] ~/reg
$

假设是数字, 那就用[0-9]限定即可了。 非常easy, 一笔带过。

我们继续继续看例如以下:

[email protected] ~/reg
$ cat test1.txt
good good study
day day up
daydayup

[email protected] ~/reg
$ grep [a-z]ay test1.txt
day day up
daydayup

[email protected] ~/reg
$

能够看到, [a-z]ay把daydayup这一行也过滤出来了, 倘若我们仅仅要过滤出含有day单词的行, 那该怎么办呢? 我们以下就会讲。

      6. \ 表示转义。 比方\<xxx就是以xxx开头的单词, xxx\>表示以xxx结尾的单词。 例如以下(正則表達式最好都加上双引號吧):

[email protected] ~/reg
$ cat test1.txt
good good study
day day up
daydayup

[email protected] ~/reg
$ grep "\<[a-z]ay\>" test1.txt
day day up

[email protected] ~/reg
$

对, 别忘了。 我们的-w选项也能够过滤单词行, 例如以下:

[email protected] ~/reg
$ cat test1.txt
good good study
day day up
daydayup

[email protected] ~/reg
$ grep -w [a-z]ay test1.txt
day day up

[email protected] ~/reg
$

可是, 以下的结果可能会出乎你我的意料:

[email protected] ~/reg
$ cat test2.txt
good good study
day day up
oh day‘abc oh
daydayup

[email protected] ~/reg
$ grep "\<[a-z]ay\>" test2.txt
day day up
oh day‘abc oh

[email protected] ~/reg
$ grep -w [a-z]ay test2.txt
day day up
oh day‘abc oh

[email protected] ~/reg
$

为什么day‘abc所在的行也被过滤出来了呢? 这就涉及到正則表達式对单词的定义了。 ‘和空格符一样, 都是切割符号。

       7. []中的^表示反义

我们知道, ^xxx表示以xxx开头的行, 可是。 在[]中的^, 就表示取反了, 例如以下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep "d[^abcd]" test.txt
good good study

[email protected] ~/reg
$ grep "d[^abcdy]" test.txt
good good study

[email protected] ~/reg
$ grep "d[^abcdy ]" test.txt

[email protected] ~/reg
$

      8. 一些字符类

比方[[:lower:]] 等价于[a-z]

比方[[:upper:]] 等价于[A-Z]

其余的还有不少, 我们不一一列举。 来看一个上述[[:lower:]]的应用, 例如以下:

[email protected] ~/reg
$ grep "^[[:lower:]]" test.txt
good good study
daydayup

[email protected] ~/reg
$ grep "^[[:upper:]]" test.txt

[email protected] ~/reg
$

       9. 不得不说的反复

前面我们已经说过, *表示对前面的字符反复0次或者多次。 我们再来复习一下:

[email protected] ~/reg
$ cat test.txt
good good study
daydayup

[email protected] ~/reg
$ grep "d.*u" test.txt
good good study
daydayup

[email protected] ~/reg
$ grep "d.*p" test.txt
daydayup

[email protected] ~/reg
$

假设要反复一次或者多次。 那就用+, 例如以下(注意, 例如以下要用扩展的正則表達式, 用grep -E或者直接用egrep):例如以下:

[email protected] ~/reg
$ echo "gd" | egrep "go*d"
gd

[email protected] ~/reg
$ echo "gd" | egrep "go+d"

[email protected] ~/reg
$ echo "god" | egrep "go+d"
god

[email protected] ~/reg
$ echo "good" | egrep "go+d"
good

[email protected] ~/reg
$

那要表示只反复0次或者1次, 该怎么搞呢? 用问号即可了。 例如以下:

[email protected] ~/reg
$ echo "good" | grep "go+d"

[email protected] ~/reg
$ echo "gd" | egrep "go?

d"
gd

[email protected] ~/reg
$ echo "god" | egrep "go?d"
god

[email protected] ~/reg
$ echo "good" | egrep "go?d"

[email protected] ~/reg
$

那要是指定反复4次, 该怎么搞呢? 例如以下:

[email protected] ~/reg
$ echo "goood" | egrep "go{4}d"

[email protected] ~/reg
$ echo "gooood" | egrep "go{4}d"
gooood

[email protected] ~/reg
$ echo "goooood" | egrep "go{4}d"

[email protected] ~/reg
$

那要是反复4次或以上, 该怎么搞呢? 例如以下:

[email protected] ~/reg
$ echo "goood" | egrep "go{4,}d"

[email protected] ~/reg
$ echo "gooood" | egrep "go{4,}d"
gooood

[email protected] ~/reg
$ echo "goooood" | egrep "go{4,}d"
goooood

[email protected] ~/reg
$

那要是反复4次到6次, 该怎么搞呢? 例如以下:

[email protected] ~/reg
$ echo "goood" | egrep "go{4,6}d"

[email protected] ~/reg
$ echo "gooood" | egrep "go{4,6}d"
gooood

[email protected] ~/reg
$ echo "goooood" | egrep "go{4,6}d"
goooood

[email protected] ~/reg
$ echo "gooooood" | egrep "go{4,6}d"
gooooood

[email protected] ~/reg
$ echo "goooooood" | egrep "go{4,6}d"

[email protected] ~/reg
$

说道这里, 关于反复的问题是非常明显了。 以下来小结一下:

x*表示0个或者多个x

x+表示1个或者多个x

x?

表示0和或者1个x

x{4}比表示4个x

x{4,}表示4个或4个以上的x

x{4,6}表示有有4个或者5个或者6个x

既然已经学了这么多, 那想想怎样匹配出一个5位的正整数呢? 例如以下:

[email protected] ~/reg
$ echo "123456" | egrep "[1-9][0-9]{4}"
123456

[email protected] ~/reg
$ echo "1234" | egrep "\<[1-9][0-9]{4}\>"

[email protected] ~/reg
$ echo "12345" | egrep "\<[1-9][0-9]{4}\>"
12345

[email protected] ~/reg
$ echo "123456" | egrep "\<[1-9][0-9]{4}\>"

[email protected] ~/reg
$

       10. ()表示总体, 例如以下:

[email protected] ~/reg
$ echo "abababc" | egrep "(ab){3,}"
abababc

[email protected] ~/reg
$ echo "abababc" | egrep "(ab){4,}"

[email protected] ~/reg
$

另外还要注意, 有时候会用()表示空(不是空格哈), 如:

[email protected] ~/reg
$ echo "ab" | egrep "a b"

[email protected] ~/reg
$ echo "ab" | egrep "a()b"
ab

[email protected] ~/reg
$ echo "ab" | egrep "a b"

[email protected] ~/reg
$ echo "a b" | egrep "a()b"

[email protected] ~/reg
$ echo "a b" | egrep "a b"
a b

[email protected] ~/reg
$

       11. |表示或, 非常好理解。

[email protected] ~/reg
$ egrep "^g|p$" test.txt
good good study
daydayup

[email protected] ~/reg
$

如上就表示以g开头或者以p结尾的行。

OK, 先说这么多。 兴许有新东东。 再补充。

时间: 2024-12-13 09:11:08

正則表達式基本使用方法简单介绍的相关文章

JavaScript正則表達式知识汇总

Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec

java正則表達式总结

近期用到的正則表達式 因为近期在做一个android的新闻client.多次用到了正則表達式.因此总结下. 1.使用正則表達式获取Rss资源内的文章内容的图片url 由于在每条新闻浏览的listView里须要新闻内容里的图片.因此你须要抓取文章第一张照片url地址.豆瓣的照片格式是: <img src="http://theimg.aliapp.com/img.php? url=http://img6.douban.com/view/presto/large/public/218991.j

正則表達式--js使用案例

前言:在前端页面使用中.遇到日期格式的验证.開始使用了一款表单控件验证.可是不兼容!!并且使用起来还受到非常大约束.所以就决定自己写原生js. 为了完毕日期格式的验证.第一步,当然是学会使用正則表達式. 曾经都是直接复制使用,这次理解原理.自己原生写. 接前两篇:js使用案例. //检測控件内容内容格式--控制为"2014-07-21". functioncheckDate(formContorId,message){ // 获取控件对象. var temp = document.ge

正則表達式及应用

一. 正則表達式 (一).概念: ????????正則表達式(regular expression)就是由普通字符(比如a到z)以及特殊字符(称为元字符)组成的一种字符串匹配的模式,能够用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. (二).正則表達式中主要元字符:[当中经常使用的元字符用红色标出,红色的元字符必须掌握.难点用蓝色标出,难点在一般的应用中并不经常使用] \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转

经验之谈—正則表達式实现图文混排

在项目中,我们常常须要发表情,以及常常须要将表情字符转换成表情.由于表情是一个图片.所以我们发给server的时候,实际上是发一段特殊的文字给server,然后转换成表情.以免浪费用户过多的流量. 那接下来.我们就来介绍一下,怎样使用正則表達式实现图文混排呢? 为了以后的代码的管理方便,我们抽取出两个类: NSString+Regular.h中.我们暴露两个方法出来: /** * 返回正則表達式匹配的第一个结果 * * @param pattern 正則表達式 * * @return 匹配的第一

JAVA学习第六十五课 — 正則表達式

正則表達式:主要应用于操作字符串.通过一些特定的符号来体现 举例: QQ号的校验 6~9位.0不得开头.必须是数字 String类中有matches方法 matches(String regex) 告知此字符串是否匹配给定的正則表達式. regex,就是给定的正則表達式 public static void checkQQ() { //第一位是数字1-9,第二位以后是0-9,除去第一位数剩下数字位数范围是5到8位 String regex = "[1-9][0-9]{5,8}";//正

正則表達式

一.概述 正則表達式是一种能够用于模式匹配和替换的强有力的工具.其作用例如以下: (1)測试字符串的某个模式.比如,能够对一个输入字符串进行測试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证. (2)替换文本.能够在文档中使用一个正則表達式来标识特定文字,然后能够所有将其删除,或者替换为别的文字: (3)依据模式匹配从字符串中提取一个子字符串. 能够用来在文本或输入字段中查找特定文字. 二.匹配字符 字符 解释说明 \ 将下一字符标记为特殊字符.文本.反向引用或

js正則表達式语法

1. 正則表達式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之同样的一个字符. 举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功:匹配到的内容是:"c":匹配到的位置是:開始于2,结束于3.(注:下标从0開始还是从1開始,因当前编程语言的不同而可能不同) 举例2:表达式 "bcd&

DOM笔记(十):JavaScript正則表達式

一.RegExp ECMAScript通过RegExp类型类支持正則表達式,语法和Perl类似: var exp = /pattern/flags; patternb部分是不论什么简单的或复杂的正則表達式:flags是每一个正則表達式所带的一个或者多个标志. 正則表達式的模式匹配支持三个标志: g:全局模式,即模式应用于整个字符串.而非在发现第一个匹配项时马上停止 i:不区分大写和小写模式 m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项. 1.创建正則表達式 Ja