shell正则表达式

所谓正则表达式,实际上就是用来描述某些字符串匹配规则的工具。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等。一个正则表达式是一个字符串.字符串里的字符被称为元字符,它们可能表示了比它们字面上看起来的意思更丰富的含义.
例如,一个引用符号可能表示引用一个人演讲中的话,或者表示下面将要讲到的,引申表示的意思.正则表达式是一个字符或/和元字符组合成的字符集,它们匹配(或指定)一个模式

在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成。

当一个正则表达式完成之后,并能够保证这个表达式一定是准确的,需要不断地测试才可以确定其正确与否。在不同的环境下,用户需要不同的工具来帮助他完成测试的过程。如果是在Shell命令行中,用户可以使用grep命令来测试。

【例1】演示如何通过正则表达式来查找字符串

#!/bin/bash
str=`cat hello.txt|grep ni`
echo "$str"
1
2
3
运行以上程序:

[root@localhost ~]# ./test.sh
hello,nihao
nishizhu
ni
nijiushi
nijiushi

1. 正则表达式基础

1.1 正则表达式的原理

在这里插入图片描述

一个正则表达式包含下面一个或多个项:

  1. 一个字符集.这里的字符集里的字符表示的就是它们字面上的意思.正则表达式最简单的情况就是仅仅由字符集组成,而没有其他的元字符.
  2. 锚.一个锚指明了正则表达式在一行文本中要匹配的位置,例如^和$就是锚.
  3. 修饰符。它们用于展开或缩小(即是修改了)正则表达式匹配文本行的范围.修饰符包括了星号. 括号和反斜杠符号.

正则表达是的主要作用是用来文本搜索和字串操作.一个正则表达式匹配一个字符或是一串字符–完整的一串字符或是另外一个字符串的子串.

2. 基本正则表达式

基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种语法标准称为扩展正则表达式,将在随后介绍。
基本正则表达式所定义的元字符主要有以下几种。
1.行首定位符“^”
是正则表达式中的定位符之一,用来匹配行首的字符,表示行首的字符是“^”后面的那个字符。正则表达式中的定位符的作用与其他的元字符不同,它们不是用来匹配具体的文本,而是匹配某个具体的位置,例如行首定位符“^”就是用来匹配文本行的开头的字符的。
【例2】演示行首定位符的用法

#! /bin/bash
#列出/etc目录中的以字母po开头的文件
str=`ls /etc | grep "^po"`
echo "$str"

运行以上程序

[root@localhost ~]# ./test.sh
polkit-1
popt.d
postfix

2.行尾定位符“$”
与行首定位符的作用恰恰相反,行尾定位符的作用是用来定位文本行的末尾的。从语法上讲,行尾定位符的位置也与行首定位符相反,行首定位符位于所作用的字符之前,而行尾定位符位于所作用的字符之后。"^$" 匹配空行.
【例3】演示行尾定位符的使用方法

#! /bin/bash
#列出/etc目录中以conf结尾的文件名
str=`ls /etc | grep "conf$"`
echo "$str"

运行以上程序:

[root@localhost ~]# ./test.sh
asound.conf
brltty.conf
cgconfig.conf
cgrules.conf
cgsnapshot_blacklist.conf
chrony.conf
dconf
.........

3.单个字符匹配“.”
圆点“.”用来匹配任意单个字符,包括空格,但是不包括换行符“\n”。当用户使用“.”符号后,意味着该位置一定有一个字符,无论它是什么字符。“13.” 匹配 13 + 至少一个任意字符(包括空格): 1133, 11333, 但不匹配 13(因为少了附加的至少一个任意字符).
【例4】演示圆点符号的用法

#! /bin/bash
#列出所有的包含字符串“13”的文件名
str=`cat dian.txt | grep "13"`
echo "$str"
echo "-------------"
#列出包含字符串samba以及另外一个字符的文件名
str=`cat dian.txt | grep "13."`
echo "$str"
[root@localhost ~]# cat dian.txt
1113
113
13
133
1133
111333

运行以上程序

[root@localhost ~]# ./test.sh
1113
113
13
133
1133
111333
-------------
133
1133
111333

4.限定符“*”
星号“*”是正则表达式中的限定符之一。限定符本身不代表任何字符,它是用来指定其前面的一个字符必须要重复出现多少次才能满足匹配。星号“*”表示匹配其前导字符的任意次数,包括0次."1133*"匹配 11 + 一个或更多的 3 + 可能的其他字符: 113, 1133, 111312, 等等.
【例5】演示星号通配符的使用方法

#! /bin/bash
#筛选出以字符s开头,紧跟着1个字符s,任意个字符s的文件名
str=`ls /etc | grep "^sss*"`
echo "$str"

运行以上程序

[root@localhost ~]# ./test.sh
ssh
ssl

5.字符集匹配“[ ]”
方括号“[ ]”的功能比较特殊,它是用来指定一个字符集合的,其基本语法为:
[abc]
其中a、b和c表示任意的单个字符。如果某个字符串在方括号所在的位置上出现了方括号中的任意一个字符,都是满足匹配规则。另外,对于连续的数字或者字母,可以使用连字符“-”来表示一个范围,例如“[a-f]”表示匹配字母表中a到f中的任意一个字母。而“[0-9]”表示匹配任意单个数字。"[B-Pk-y]" 匹配从 B 到 P 或从 k 到 y 的任意一个字符. “[^b-d]” 匹配除了从 b 到 d 范围内所有的字符. 这是正则表达式中反转意思或取否的一 个例子.(就好像在别的情形中!字符所扮演的角色).

多个方括号字符集组合使用可以匹配一般的单词和数字模式."[Yy][Ee][Ss]" 匹配 yes, Yes, YES, yEs, 等等.
"[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]"匹配社会安全码(Social Security number)
【例6】演示方括号的使用方法

#! /bin/bash
#筛选所有以字符r开头,并且紧跟着1个字符c的文本行
str=`ls /etc |grep "^rc"`
echo "$str"
echo "---------------------"
#筛选所有以字符r开头,紧跟着1个字符为c,下面1个字符为单个数字的文本行
str=`ls /etc | grep "^rc[0-9]"`
echo "$str"

运行以上程序

[root@localhost ~]# ./test.sh
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
---------------------
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

6.字符集不匹配“[^]”
前面已经介绍过行首定位符“^”和字符集匹配符“[ ]”。但是如果将这2个符号结合起来,则其意义会发生变化。符号“[^]”表示不匹配其中列出的任意字符,其语法如下:
[^abc]
其中a、b和c表示任意的单个字符。“[^]”符号的用法与符号“[ ]”的用法相同,不再举例说明。
除了前面介绍的6个元字符之外,在基本正则表达式中还定义了其他的一些元字符。这些元字符使用较少,语法较繁琐,且在扩展正则表达式和PERL正则表达式中都有替代的元字符,所以不再详细说明。表中列出了基本正则表达式的其他的元字符。

在这里插入图片描述

7.反斜杠字符
\转义(escapes) 一个特殊的字符,使这个字符表示原来字面上的意思.
“\$“表示了原来的字面意思”$”,而不是在正则表达式中表达的匹配行尾的意思.
同样,"\\“也被解释成了字面上的意思”\".
8.转义(escape)“尖角号”\<…\>
用于表示单词的边界. 尖角号必须被转义,因为不这样做的话它们就表示单纯的字面意思而已."\<the\>" 匹配单词"the",但不匹配"them", “there”, “other”, 等等.

3. 扩展正则表达式

扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。上文中介绍的元字符“^”、“$”、“.”、“*”、“[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。
1.限定符“+”
匹配一个或多个前面的字符.它的作用和*很相似,但唯一的区别是它不匹配零个字符的情况.
echo a111b | grep ‘a1\+b’
echo a111b | gawk ‘/a1+b/’
echo a111b | sed -ne ‘/a1\+b/p’
这三句的效果都等同

【例7】演示加号“+”的使用方法

#! /bin/bash
#筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行
str=`ls /etc | egrep "^sss+"`
echo "$str"

运行以上程序

[root@localhost ~]# touch /etc/sssd
[root@localhost ~]# ./test.sh
sssd

2.限定符“?”
问号“?”是另外一个限定符,它用来限定前面的字符最多只出现1次,即前面的字符可以重复0次或者1次。
【例8】演示问号通配符的使用方法

#! /bin/bash
#筛选以字符串“ss”开头,后面跟着0或者1个s的文本行
str=`ls /etc | egrep "^sss?"`
echo "$str"

运行以上程序

[root@localhost ~]# ./test.sh
ssh
ssl
sssd

3.竖线“|”和圆括号“()”
竖线“|” 表示多个正则表达式之间“或”的关系,其语法为:
expression1|expression2|e=xpression3|…|expressionn
圆括号“()”用来表示一组可选值的集合。竖线和圆括号经常在一起使用,表示一组可选值。
4.转义"大括号"{ }指示前面正则表达式匹配的次数.
要转义是因为不转义的话大括号只是表示他们字面上的意思.这个用法只是技巧上的而不是基本正则表达式的内容.
“[0-9]\{5\}” 精确匹配 5 个数字 (从 0 到 9 的数字).
注意:大括号不能在“经典”(不是 POSIX 兼容)的正则表达式版本的 awk 中使用. 然而, gawk 有一个选项- -re-interval 来允许使用大括号(不必转义).
bash$ echo 2222 | gawk --re-interval ‘/2{3}/’
2222

【例9】演示圆括号和竖线的使用方法

#! /bin/bash
#筛选含有字符串“ssh”、“ssl”或者以字符串“yum”开头的文本行
#grep -E主要是用来支持扩展正则表达式
#grep -E =egrep
str=`ls /etc | egrep "(ssh|ssl|^yum)"`
echo "$str"

运行以上程序

[root@localhost ~]# ./test.sh
ssh
ssl
yum
yum.conf
yum.repos.d

4. Perl正则表达式

正则表达式是Perl语言的一大特色。Shell中的grep和egrep命令都支持Perl正则表达式。Perl正则表达式的元字符与扩展正则表达式的元字符大致相同,扩展正则表达式中的元字符在Perl正则表达式中都得到了了支持。另外,Perl正则表达式还增加了一些元字符。下面对常用的增加的元字符进行介绍。
1.数字匹配\d
符号“\d”匹配从0到9中的任意一个数字字符,等价于表达式“[0-9]”。
【例10】演示符号“\d”的使用方法

#! /bin/bash
#筛选以字符串rc开头,紧跟着一个数字的问本行
#-P 可以让grep使用perl的正则表达式语法
str=`ls /etc | grep -P "^rc\d"`
echo "$str"

运行以上程序

[root@localhost ~]# ./test.sh
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

2.非数字匹配\D
符号“\D”和符号“\d”的作用恰好相反,后者是匹配一个0~9之间的单个数字字符,而前者则匹配一个非数字字符。“\D”等价于表达式“[^0-9]”。
3.空白字符匹配\s
符号“\s”匹配任何空白字符,包括空格、制表符以及换页符等,等价于表达式“[\f\n\r\t\v]”。
4.非空白字符匹配\S
符号“\S”匹配任何非空白字符,等价于表达式“[^\f\n\r\t\v]”。

正则表达式字符集
一个正则表达式就是由一系列字符组成的字符串。其中,包括元字符和普通字符。由于元字符和普通字符都有许多个,所以形成了元字符集和普通字符集这两个集合。
在正则表达式中,普通字符集中的字符只表示它们的字面涵义,不对其他的字符产生影响。正则表达式的最简单的形式就是只由普通字符集中的字符组成,不包含元字符。
正则表达式的字符集通常使用方括号表达式表示,例如:
[cC]hina
[^hello]
[a-zA-Z]
[0123456789]
[0-9]

与其他的普通字符一样,上表中列出的字符类也需要放在方括号中。例如:
[[:alnum:]]
等价于以下表达式:
[a-zA-Z0-9]

在这里插入图片描述 

正则表达式应用
匹配单个字符
在正则表达式中,可以用来匹配单个字符的表达式大致有4种,分别是单个一般字符、转义后的元字符、圆点“.”表达式以及方括号表达式。下面分别进行介绍。
1.单个一般字符
所谓一般字符,是指除了正则表达式中已经定义的元字符之外的所有字符,例如英文字符、数字、空白字符以及标点符号等。这些一般字符组正则表达式中都只是表达它们自身的字面意义,没有其他额外的意义。当需要匹配某个一般字符时,可以直接将该字符作为表达式或者是表达式的一部分。
【例11】演示如何使用普通字符作为表达式来匹配单个字符

#! /bin/bash
#搜索含有字符“a”的文本行
str=`grep "a" demo2.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# cat demo2.txt 
a1234
nihaoya
hhhhh
nishishei
hello,abc
[root@localhost ~]# ./test.sh
a1234
nihaoya
hello,abc
1
2
3
4
5
6
7
8
9
10
2.转义后的元字符
在前面介绍基本正则表达式、扩展正则表达式以及Perl正则表达式的时候,都介绍了一些元字符。如果想要匹配这些元字符本身,则需要在这些字符的前面加上转义字符“\”。通过这样操作,可以关闭这些元字符的特殊意义,而只保留其字面意义。
例如,如果想要匹配圆点“.”就可以使用表达式“\.”。经过转义之后,这个表达式就表示一个圆点符号,而不是任意单个字符。如果想要匹配其他的元字符,例如问号“?”,同样可以使用表达式“\?”。
【例12】演示直接使用元字符圆点作为表达式,则会导致匹配结果出错

#! /bin/bash
str=`grep "." demo3.txt`    #匹配出错
echo "$str"
echo "======================="
str=`grep "\." demo3.txt`    #匹配有.的行
echo "$str"
1
2
3
4
5
6
运行以上程序

[root@localhost ~]# ./test.sh
No matter what you're looking for, our motto is "keep it simple" 
Start by entering a basic name or word. 
If you're looking for a place or product in a specific location, 
enter the name along with the town or zip code.
=======================
Start by entering a basic name or word. 
enter the name along with the town or zip code.
1
2
3
4
5
6
7
8
3.圆点表达式
圆点“.”表示匹配任意单个字符,除了换行符之外。关于圆点表达式的使用方法,请参见例4,不再重复介绍。
4.方括号表达式
前面已经介绍过,方括号表达式用来表示一个可选字符的集合。尽管通常情况下,在方括号中含有多个字符,但是一次只能从这些字符中选择一个,因此,方括号表达式仍然表示的是匹配单个字符。例如,表达式“[abc]”就表示匹配字符“a”、“b”或者“c”中的任意一个。同时,这种表示方法也是最简单的一种形式,也就是直接将所要匹配的字符都在方括号中罗列出来。
如果在方括号中的字符列表前面加上符号“^”,则表示取反的意思。也就是说,不匹配方括号中列出来的任何一个字符。例如,表达式“[^abc]”表示不匹配“a”、“b”和“c”这3个字符中的任何一个。

匹配多个字符
正则表达式可以使用多种方法来匹配多个字符,其中最简单的一种就是将多个字符按照指定的顺序拼接起来。
【例13】演示如何匹配一个有多个字符组成的字符串

#! /bin/bash
#搜索字符串“matter”
str=`grep "matter" demo3.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# ./test.sh
No matter what you're looking for, our motto is "keep it simple" 
1
2
【例14】演示如何将普通字符和方括号表达式混合起来使用

#! /bin/bash
#匹配含有字符“o”,后面紧跟着字符“r”或者“u”的文本行
str=`grep "o[ru]" demo3.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# ./test.sh
No matter what you're looking for, our motto is "keep it simple" 
Start by entering a basic name or word. 
If you're looking for a place or product in a specific location, 
enter the name along with the town or zip code.
1
2
3
4
5
【例15】使用星号来匹配多个字符“o”

#! /bin/bash
#匹配任意多个字符“o”
str=`grep "lo*king" demo3.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# ./test.sh
No matter what you're looking for, our motto is "keep it simple" 
If you're looking for a place or product in a specific location, 
1
2
3
【例16】演示如何通过正则表达式来筛选符合指定格式的电话号码

#! /bin/bash
#筛选符合格式的电话号码
str=`egrep "800-[[:digit:]]{3}-[[:digit:]]{4}$" demo4.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# cat demo4.txt 
A:800-820-1100
B:800-820-0323
C:800-820-6655
D:800-810-2288
HH:800-123-6666
HA:800-456-222
E:720-3210-1100
F:450-432-0323
G:420-4555-665
H:230-4847-228
[root@localhost ~]# ./test.sh
A:800-820-1100
B:800-820-0323
C:800-820-6655
D:800-810-2288
HH:800-123-6666
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
【例17】演示如何使用行首定位符筛选数据行

#! /bin/bash
#筛选以3个数字开头的文本行
str=`egrep "^[[:digit:]]{3}" demo5.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# cat demo5.txt
1342343
14325-23544
4332-234
23
234
1-42341342343
[root@localhost ~]# ./test.sh
1342343
14325-23544
4332-234
234
1
2
3
4
5
6
7
8
9
10
11
12
【例18】演示行尾定位符的使用方法

#! /bin/bash
#筛选以4个数字结尾的文本行
str=`egrep "[[:digit:]]{4}$" demo5.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# ./test.sh
1342343
14325-23544
1-42341342343
1
2
3
4
子表达式
所谓子表达式,是指由多个普通字符或者元字符组成的一个小的正则表达式。与正则表达式一样,子表达式本身也是一个完整的表达式,但是在使用时,子表达式是作为一个大的正则表达式的一部分来使用的,而不是单独使用。在正则表达式中,子表达式作为一个整体来看待。子表达式使用圆括号()括起来。
【例19】通过正则表达式定位所有的2个连续的HTML空格符

#! /bin/bash
str=`egrep "&nbsp;{2}" html.txt`
echo "$str"
1
2
3
运行以上程序

[root@localhost ~]# cat html.txt
&nbsp;&nbsp;
&nbsp;;&nbsp;;
&nbsp;;
&nbsp;
&nbsp;;hhhhhh&nbsp;;
&nbsp;kkkk&nbsp;
[root@localhost ~]# ./test.sh
&nbsp;;&nbsp;;
&nbsp;;
&nbsp;;hhhhhh&nbsp;;
1
2
3
4
5
6
7
8
9
10
11
【例20】演示通过正则表达式匹配IP地址的方法

#! /bin/bash
#匹配IP地址
str=`egrep "^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" ip.txt`
echo "$str"
1
2
3
4
运行以上程序

[root@localhost ~]# cat ip.txt
202.116.3.2
10.0.0.1
256.45.2.1
123.354.78.34
243.324.3423.234
6732.2386.78.4
[root@localhost ~]# ./test.sh
202.116.3.2
10.0.0.1
256.45.2.1
123.354.78.34
1
2
3
4
5
6
7
8
9
10
11
12
【例21】通过正则表达式分别对IP地址的4组数字都给出明确的匹配规则


1
运行以上程序


1
通配符
Shell使用了正则表达式中的某些元字符作为其通配符,常用的有*、?、[]、{}以及^等。这些字符在Shell中的意义与在正则表达式中的意义有些区别,例如*表示匹配任意的字符,而非正则表达式中的限制其前导字符的0次或者多次重复。?表示一个字符,而非其前导字符的0次或者1次重复。
如果用户想要列出以h开头的当前目录中所有的文件,可以使用以下命令:

[root@localhost ~]# ls -l h*
-rw-r--r--. 1 root root 66 Jun 20 07:30 hello.txt
-rw-r--r--. 1 root root 81 Jun 20 09:44 html.txt
1
2
3
如果想要列出以字符d或者h开头的文件名,则可以使用方括号将这些字符列出来,如下:

[root@localhost ~]# ls -l [dh]*
-rw-r--r--. 1 root root  40 Jun 20 09:06 demo2.txt
-rw-r--r--. 1 root root 221 Jun 20 09:11 demo3.txt
-rw-r--r--. 1 root root 152 Jun 20 09:37 demo4.txt
-rw-r--r--. 1 root root  50 Jun 20 09:33 demo5.txt
-rw-r--r--. 1 root root  29 Jun 20 07:52 dian.txt
-rw-r--r--. 1 root root  66 Jun 20 07:30 hello.txt
-rw-r--r--. 1 root root  81 Jun 20 09:44 html.txt
1
2
3
4
5
6
7
8
在某些情况下,文件名是按照字母或者数字顺序来编号的,在这种情况下,用户可以使用连字符来表示一个范围,这与正则表达式中的表达方法是一致的,如下:

[root@localhost ~]# ls -l demo[0-9].txt
-rw-r--r--. 1 root root  40 Jun 20 09:06 demo2.txt
-rw-r--r--. 1 root root 221 Jun 20 09:11 demo3.txt
-rw-r--r--. 1 root root 152 Jun 20 09:37 demo4.txt
-rw-r--r--. 1 root root  50 Jun 20 09:33 demo5.txt
1
2
3
4
5
grep命令
在Shell的命令中,grep命令是一个与正则表达式关系非常密切,并且使用也非常频繁的命令。

grep命令的基本语法
grep命令的名称来自于全局搜索正则表达式并打印文本行(Global Search Regular Expression and Print out the line)的缩写。它是一个非常古老的UNIX命令,也是一种强大的文本搜索工具。grep命令使用正则表达式来搜索文本,并且把匹配的文本行打印出来。
grep命令的基本语法如下:
grep [options] pattern [file…]
在上面的语法中,options表示选项,如表8-3所示。pattern表示要匹配的模式,file表示一系列的文件名。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并且打印出来。模式后面的所有的字符串参数都被看作是文件名。

在这里插入图片描述

 

例如,下面的命令将搜索名称为demo3.txt文件中是否含有字符串simple的文本行,命令如下:

[root@localhost ~]# grep simple demo3.txt
No matter what you're looking for, our motto is "keep it simple" 
1
2
如果只想统计含有某个模式的行数,则可以使用-c选项,如下:

[root@localhost ~]# grep -c simple demo3.txt
1
1
2
grep命令族简介
随着UNIX的发展,grep命令也在不断地完善。到目前为止,grep命令族已经包括grep、egrep以及fgrep等3个命令。egrep和fgrep命令只跟grep命令有很少的区别。其中,egrep命令是grep命令的扩展,它使用扩展正则表达式作为默认的正则表达式引擎,因此,egrep命令支持更多的元字符。fgrep命令是fixed grep或者fast grep的缩写。在fgrep命令中,所有的字母都看作是单词,也就是说,在fgrep命令中,所有的正则表达式中的元字符都将作为一般字符,仅仅拥有其字面意义,不再拥有特殊意义。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值