正则表达式学习——精通正则表达式

  不少编程高手说计算机领域称得上伟大的发明技术不多,但正则表达式绝对算一个。我姑且相信一回,来准备精通一下。

第一章正则表达式介绍

  正则表达式相当于一个我们要找的文本内容抽象集合模型,就是说我先建一个正则表达式集合模型,凡是符合这个集合模型的,都可以匹配查找出来。正则表达式的英文翻译是:regular expression,regular有有规律的、规则的意思。翻译成中文,正确规则的表达式,不知道哪个家伙翻译成正则表达式(缩减的贱萌无极限啊。。。。。)

  正则表达式是通过正则表达式引擎来驱动的,目前linux常用的正则表达式引擎有两种:

  1.POSIX基本正则表达式(BRE)引擎 Basic Regular Expression Engine

  2.POSIX扩展正则表达式(ERE)引擎 Extended Regular Expression Engine

  很多使用的程序如sed并不完全实现BRE规范,只是其中的一个子集,这主要是为了速度上的考虑

  元字符的含义:

  元字符是指作为正则表达式核心的有语法含义的一些字符,这些字符是表达式的骨架,我们要找的字符串可以放在这个骨架中,构成一个完整的语法来查找文本中的字符串。正则表达式规范认可的元字符有11个,它们是:(这里的冒号不是)    .+*^  ?$  ()[]{}    \|  中间用空白隔开是将符号分类,这样好记点。

  介绍基本的元字符:以hola作为例子

  ^(数字键6上方的符号):匹配字符串位于任意一个文本行的行首位置的字符串,比如abc hola cde,如果^hola进行匹配将匹配不出来,因为hola不位于行首

  $:美刀符号,这个符号找出正则字符串位于任意一行行尾

  *:通配符,这个符号能通配任意类型任意个数字符串,比如hola*能匹配出所有以hola开头的字符串,注意不能用只有一个单字符*匹配出全文,*必须与其他字符联合进行匹配。例如grep * portal.log 这个正则命令匹配不出东西,需要*与其他字符一起用,例如grep hola.* portal.log

  []:范围符,只能匹配一个字符,范围符号有两种用法:

  一种是将正则字符串某个位置的字符可能值列出来,[某个位置的字符可能值,如abc]即[abc]这个符号的作用是正则字符串的某个字符可能是范围符号里面的任何一个,那么执行正则命令后,得到的字符集里面的对应位置的字符会列出包含范围符所列的字符。比如说我不确定separate的正确写法是什么,可能是seperate,这时候可以用sep[ae]rate进行匹配。

  一种是正则字符串某个位置的字符可能是序列型或者连续型字符,这时候与符号-联合起来使用比如sep[a-z]rate,就是第四个字符可能是a-z的任何一个字符,如果我们采用第一种方式需要将26个字符全部列出来,显然这是很麻烦的sep[abcdefghijklmnopqrstuvwxyz]rate(方括号里面的字符顺序随意,只要是字符列表就可以了),显然我们可以采用后一种。另外也可以运行多种类型的字符例如

  [a-z0-9A-Z_?.]能够匹配a-z,0-9和A-Z的所有字符还有下划线问号点号,注意a-z0-9A-Z之间没有逗号,此时的-表示范围,是一个元字符,而其他的_?.都表示普通字符。

  范围符号[]可以用于解析可能拼错的单词,比如搜索引擎里面进行单词搜索时候,如果输入错误术语,搜索引擎会提示,你可能想输入的是纠正后的什么什么什么

  \:转义符号,用来屏蔽元字符的转义,而把元字符当作一个普通字符进行匹配。

  ?或.  :进行任意类型的单个字符匹配,这个与*类似,只不过只能匹配一个。

  限定匹配字符次数(以A表示某个字符)

  字符A\{n\} 匹配字符A出现n次。pattern表示
  字符A\{n,\} 匹配字符A出现最少n次。
  字符A\{n,m} 匹配字符A出现n到m次之间,n , m为0 - 2 5 5中任意整数。

   排除某个字符组:

  ^1-6:这个表达式的含义是搜索满足没有1到6共6个数字的那些字符串

  sed 和gawk实用程序的使用:

  sed 即stream editor 流式编辑器 流编辑器可以根据提供的规则进行文本编辑,流编辑器每次只读一行,进行规则匹配修改后输出到STDOUT(标准输出,即显示器,可以使用重定向进行变向输出),一行处理完毕后,再处理下一行。重复进行这个过程,直到所有文本处理完毕。

  sed编辑器使用语法:

  sed options  script  file

  options有如下三个参数:

  -e script   将script中的指定的命令添加到处理输入时执行的命令中

  -f file    将file中的指定命令添加到处理输入时执行的命令中

  -n     不需要为每个命令产生输出,但需要等待打印结果

 

1.sed 支持STDIN输入流
这个功能允许其他命令产生的输出,用管道符号|输入给sed命令进行处理
参数:s 这个参数用于替换
语法:
sed 's/string1/string2/'
这个命令的功能是用string2替换string1
注意:
1.参数s前面没有符号-
2.两个字符串用3个
3.这个命令前面需要有输入流,然后会支持标准输出流和重定向输出,默认的输出是STDOUT即显示器输出。
4.sed并不修改原文件,只是将修改结果发送到STDOUT
两种用法:
1.输出流|sed 's/string1/string2/'
2.sed 's/string1/string2/' 文件名

替换的扩充版:
sed 's/string1/string2/flags'
flags:表示怎样进行替换,有如下几个参数:
a:数字 ,如果是n表示替换第n个数据字段
b:g 用string1替换所有string1
c:p 打印原始行,通常与-n参数一起使用
d:w newfile 将结果写入新文件newfile中,注意:写入新文件的只是匹配模式的那些行,没有匹配修改的不保存
hadoop@sdp15:~/RE> echo "This is a book;This is a desk" | sed 's/This/That/2'
This is a book;That is a desk
hadoop@sdp15:~/RE> echo "This is a book;This is a desk" | sed 's/This/That/g'
That is a book;That is a desk
hadoop@sdp15:~/RE> echo "This is a book;This is a desk" | sed -n 's/This/That/p'
That is a book;This is a desk
hadoop@sdp15:~/RE> echo "This is a book;This is a desk" | sed 's/This/That/p'>fg.txt
hadoop@sdp15:~/RE> echo "This is a book;This is a desk" | sed 's/This/That/w fg.txt'
That is a book;This is a desk

-e参数:支持多个命令
sed -e '模式1;模式2;。。。模式n' 文件
例子:
sed -e 's/string1/string2/;s/string3/string4/' file2
注意:模式之间用分号隔开,模式结尾和分号之间不能有空格
如果模式没有匹配上,则仍然按照原来的输出。
支持多行输入
sed -e '
模式1
模式2
模式n 文件名

-f参数:支持命令脚本
如果需要模式很多,比如进行多个单词替换,可以讲这些模式单独写在一个脚本文件里面,需要用参数-f
vi script1
模式1
模式2
。。。。
模式n

sed -f script1 file2
scrip1是处理目标文件file2的模式脚本
-n 参数禁止sed输出,-p是输出修改的,-n -p输出匹配后的。。。。不知道什么逻辑
可以对比下看看:
hadoop@sdp15:~/RE> vi data.txt

this is a book
this is a desk
hello

hadoop@sdp15:~/RE> sed '/is/p' data.txt 
this is a book
this is a book
this is a desk
this is a desk
hello

hadoop@sdp15:~/RE> sed -n '/is/p' data.txt 
this is a book
this is a desk
例子:

vi script1

s/hello/hola/
s/but/however/
s/nice/gut/

sed -f script1 file2

gawk使用
gawk是比sed更高级的流式编辑器,它同时也是一种编程语言,因而可以定义变量,进行更复杂的处理
gawk程序脚本使用大括号{},包含命令
语法:
输入流|gawk 参数块 命令块或脚本块 目标处理文件
备注:是命令块或脚本块决定于参数,默认用命令块,用参数-f表示使用脚本,这个与sed一致,把多个命令块放在文件里面就是脚本,命令块包括大括号,不包括单引号
例如:
gawk '{print "Hello World"}'
这个命令需要数据,如果没有重定向数据输入,则需要等待STDIN数据输入,执行上述命令后,会等待用户输入,然后固定输出Hello World,对于用户输入的任何内容,输出的都是Hello World

1.使用数据字段变量
gawk可以进行文本处理,可以将字段定义成变量,然后进行流式处理
$0:表示正行文本
$1:表示文本行的第一个数据字段,即第一列
$n:表示文本行的第n个数据字段,即第n列
数据字段是依据字段分隔符进行确定的,默认的字段分隔符是空白符(包括空格,制表符)
可以指定数据字段分隔符,需要用参数 -F分隔符 进行明确
gawk -F:'{print $0}' file2
这里指定了分隔符冒号

注意:gawk 参数块 命令块 文件 这几个模块之间需要用空格隔开,如果连在一起了系统会识别不出来或者报别的难以料到的问题。

2.在脚本中使用多个命令
所有的命令都用一个共同的大括号包起来,命令之间用分号隔开
echo "Hello World" | gawk '{$2="Hola";print $0}'
3.使用参数-f,将命令块放在脚本中
vi script2
{print $5"'s userid is " $1}

gawk -F: -f script2 file2

gawk 引用一个字符串时候,不需要用美元符号

4.在处理数据之前,运行脚本
使用BEGIN关键字
gawk 'BEGIN 命令' file2
hadoop@sdp15:~/RE> gawk 'BEGIN {print "HELLO WORLD"}{print $0} END {print "Buenas Noches"}'
HELLO WORLD
Buenas Noches
5.使用END处理完数据后继续执行脚本
执行带BEGIN命令后,按ctl+D则执行END后的脚本
hadoop@sdp15:~/RE> gawk 'BEGIN {print "HELLO WORLD"}{print $0} END {print "Buenas Noches"}'
HELLO WORLD
Buenas Noches

退出gawk需要生成EOF(END OF FILE)结束运行,只需按ctl+D就可以了
6.将多个命令脚本化
注意:命令的大括号紧跟在BEGIN后面,不然系统会识别不了,报gawk: script3:2: BEGIN blocks must have an action part
BEGIN{
print "The latest list of all users and shells"
print "Userid Shell"
print "------ -----"
FS=":"
}

{
print $1 " " $7
}

END{
print "Hello World"

}

对比:gawk和sed
两种命令的模块都是:gawk/sed 参数快 单引号包的命令块 文件

7.字符串分隔符
我们用gawk和sed进行文本处理时候,都是用/作为字符串分隔符的,这个分隔符遇到路径时候比如/bin/bash,如果遇到路径需要替换成/bin/csh(比如进行程序移植时候,有些是不支持bash的),这时候用/进行就会很混乱(\表示转义)
sed 's/\/bin\/bash/\/bin\/csh'
这时候可以换一种支持部分元字符作为替换符号如?,(,!,可以用感叹号,这个比较明显
sed 's!/bin/bash!/bin/csh!'


正则表达式:定义BRE模式
gawk '/book/{print $0}'
sed -n '/book/p'

正则表达式规则1:正则表达式区分大小写
正则表达式规则2:如果没有元字符^和$限定字符串出现的位置,匹配将不限定位置
规则3:匹配字符串时候,如果空格也是字符串的一部分,也正常匹配
例如sed -n '/ /p' file可以匹配出有空格的行
正反斜杠/\都属于特殊字符,如果进行匹配都需要用转义字符\进行转义处理,用\\和\/进行匹配
sed进行正则表达式匹配时候,匹配规则放在//中如:echo "this is a good book"|sed -n '/^book/p',^又称为脱字符,^如果放在其他位置,就属于普通字符,而不表达匹配行首字符串的意思

^string1$:两个字符联合定位,定位的是某一个完整的行
^$:这个匹配没有任何内容的行,可以利用这个特点来删除空行
sed -n '/^$/d' file
上述:d表示删除

点字符:点字符用于匹配任何一个除了换行符以外的字符,注意:点字符必须匹配一个字符而且只能匹配一个字符,如果圆点位置不存在字符,那么无法匹配。
echo "at ten ,we come back"|sed -n '/.at/p',这一句将无法匹配出行首的at,除了通配符*?允许配成0个外,其他的元字符是必须匹配至少可能一个的

模式是匹配结果的抽象,也是匹配结果任何一个字符串的一个子部分,记住这一点

除了通配符*可以匹配任意多个字符外,其他的符号是不能匹配多个字符的
比如说:sed -n '/hola/p' 输出所有含有hola的结果
那么hola,holala,holaabc,从这里可以看到匹配模式hola是所有字符串的一个子部分,hola在hola中,也在holala中,也在holaabc中,不在其中的将不会被匹配出来,比如hol肯定不会被匹配出来
否定字符:^ 这个字符也是脱字符,直接用于//中时是脱字符,进行行首字符串匹配,用于[^string]中时是否定字符,意思是不包含string的所有字符串

特殊字符类
用一个单词代表一类字符
[[:alpha:]]:匹配任意大写或小写字母
[[:alnum:]]:匹配任意字母或数字
[[:blank:]]:空白,匹配空格或者制表符
[[:digit:]]:匹配0~9之间的数字
[[:lower:]]:匹配任意小写字母
[[:upper:]]:匹配任意大写字母
[[:print:]]:匹配任意可以打印的字符
[[:punct:]]:匹配标点符号
[[:space:]]:匹配空白符号:空格,制表符,NL,VT,FF,CR

通配符:*这个通配符,必须放在某个字符后面,表示该字符出现0次或者多次,出现0次时候e和0一起e0即表示不出现,所以下面的命令可以匹配出来
hadoop@sdp15:~/RE> echo "ik"|sed -n '/ie*k/p'
ik
在可能多余的字符后面加一个星号,表示允许接受错误的单词,不能把两个及两个以上的*同时使用,即:**是非法的
也可以把点号.和星号*放在一起,匹配任何一种字符串:即.*
echo "ik"|sed -n '/i.*k/p'
也可以把*作用于一个范围内的字符组即[abcde]* 就是[]内的几个字符可以出现0次或者多次,注意:要么出现,并且只出现范围符内的字符,不能出现别的字符,要么不出现
echo "hola"|sed -n '/ho[ab]*a/p'将匹配不出来什么

扩展的正则表达式:
ERE模式
ERE是对正则表达式进行了扩展,sed不能识别,但是gawk可以识别
问号:?
表示匹配0次或者1次,2次及2次以上将不能识别

echo 'hola'|gawk '/holl?a/ {print $0}'
加号:+
表示加号作用于加号紧挨的前面的有并且至少有一次
大括号{}
用大括号来限定模式出现的具体次数,注意此时需要和参数--re-interval联合起来使用
[字符列表]{m}:表示字符列表中的字符必须出现m次
[字符列表]{m,n}表示字符列表中的字符出现m到n次之间,包括m和n次

echo 'beat'|gawk --re-interval '/b[ea]{1}t/ {print $0}'
匹配模式块 命令块
beat 
echo 'beat'|gawk --re-interval '/b[ea]{1,2}t/ {print $0}'

管道符号:| 这里的|更应该理解为逻辑符号或|
管道符号可以匹配多个模式
模式1|模式2|模式3
执行时候可以进行多种形式的匹配,通过某种模式都会通过
echo 'this is a dog' | gawk '/cat|dog|fish/ print $0'
//内的|两边没有空格
echo 'this is a cat' | gawk '/[ch]at|dog|fish/ print $0'

小括号()
将匹配表达式进行分组
echo 'this is a cat' | gawk '/(c|h)a(t|p)/'
下面这样写是不对的:
echo 'this is a cat' | gawk '/(c|h)|a|(t|p)/'

正则表达式实战

 

精通正则表达式第三版 搜集于网络 前言..........I 第1章:正则表达式入门.... 1 解决实际问题... 2 作为编程语言的正则表达式... 4 以文件名做类比... 4 以语言做类比... 5 正则表达式的知识框架... 6 对于有部分经验的读者... 6 检索文本文件:Egrep. 6 Egrep元字符... 8 行的起始和结束... 8 字符组... 9 用点号匹配任意字符... 11 多选结构... 13 忽略大小写... 14 单词分界符... 15 小结... 16 可选项元素... 17 其他量词:重复出现... 18 括号及反向引用... 20 神奇的转义... 22 基础知识拓展... 23 语言的差异... 23 正则表达式的目标... 23 更多的例子... 23 正则表达式术语汇总... 27 改进现状... 30 总结... 32 一家之言... 33 第2章:入门示例拓展.... 35 关于这些例子... 36 Perl简短入门... 37 使用正则表达式匹配文本... 38 向更实用的程序前进... 40 成功匹配的副作用... 40 错综复杂的正则表达式... 43 暂停片刻... 49 使用正则表达式修改文本... 50 例子:公函生成程序... 50 举例:修整股票价格... 51 自动的编辑操作... 53 处理邮件的小工具... 53 用环视功能为数值添加逗号... 59 Text-to-HTML转换... 67 回到单词重复问题... 77 第3章:正则表达式的特性和流派概览.... 83 在正则的世界中漫步... 85 正则表达式的起源... 85 最初印象... 91 正则表达式的注意事项和处理方式... 93 集成式处理... 94 程序式处理和面向对象式处理... 95 查找和替换... 98 其他语言中的查找和替换... 100 注意事项和处理方式:小结... 101 字符串,字符编码和匹配模式... 101 作为正则表达式的字符串... 101 字符编码... 105 正则模式和匹配模式... 110 常用的元字符和特性... 113 字符表示法... 115 字符组及相关结构... 118 锚点及其他“零长度断言” 129 注释和模式量词... 135 分组,捕获,条件判断和控制... 137 高级话题引导... 142 第4章:表达式的匹配原理.... 143 发动引擎... 143 两类引擎... 144 新的标准... 144 正则引擎的分类... 145 几句题外话... 146 测试引擎的类型... 146 匹配的基础... 147 关于范例... 147 规则1:优先选择最左端的匹配结果... 148 引擎的构造... 149 规则2:标准量词是匹配优先的... 151 表达式主导与文本主导... 153 NFA引擎:表达式主导... 153 DFA引擎:文本主导... 155 第一想法:比较NFA与DFA.. 156 回溯... 157 真实世界中的例子:面包屑... 158 回溯的两个要点... 159 备用状态... 159 回溯与匹配优先... 162 关于匹配优先和回溯的更多内容... 163 匹配优先的问题... 164 多字符“引文” 165 使用忽略优先量词... 166 匹配优先和忽略优先都期望获得匹配... 167 匹配优先、忽略优先和回溯的要旨... 168 占有优先量词和固化分组... 169 占有优先量词,?+、*+、++和{m,n}+. 172 环视的回溯... 173 多选结构也是匹配优先的吗... 174 发掘有序多选结构的价值... 175 NFA、DFA和POSIX.. 177 最左最长规则... 177 POSIX和最左最长规则... 178 速度和效率... 179 小结:NFA与DFA的比较... 180 总结... 183 第5章:正则表达式实用技巧.... 185 正则表达式的平衡法则... 186 若干简单的例子... 186 匹配连续行(续前)... 186 匹配IP地址... 187 处理文件名... 190 匹配对称的括号... 193 防备不期望的匹配... 194 匹配分隔符之内的文本... 196 了解数据,做出假设... 198 去除文本首尾的空白字符... 199 HTML相关范例... 200 匹配HTML Tag. 200 匹配HTML Link. 201 检查HTTP URL. 203 验证主机名... 203 在真实世界中提取URL. 206 扩展的例子... 208 保持数据的协调性... 209 解析CSV文件... 213 第6章:打造高效正则表达式.... 221 典型示例... 222 稍加修改——先迈最好使的腿... 223 效率vs准确性... 223 继续前进——限制匹配优先的作用范围... 225 实测... 226 全面考查回溯... 228 POSIX NFA需要更多处理... 229 无法匹配时必须进行的工作... 230 看清楚一点... 231 多选结构的代价可能很高... 231 性能测试... 232 理解测量对象... 234 PHP测试... 234 Java测试... 235 VB.NET测试... 237 Ruby测试... 238 Python测试... 238 Tcl测试... 239 常见优化措施... 240 有得必有失... 240 优化各有不同... 241 正则表达式的应用原理... 241 应用之前的优化措施... 242 通过传动装置进行优化... 246 优化正则表达式本身... 247 提高表达式速度的诀窍... 252 常识性优化... 254 将文字文本独立出来... 255 将锚点独立出来... 256 忽略优先还是匹配优先?具体情况具体分析... 256 拆分正则表达式... 257 模拟开头字符识别... 258 使用固化分组和占有优先量词... 259 主导引擎的匹配... 260 消除循环... 261 方法1:依据经验构建正则表达式... 262 真正的“消除循环”解法... 264 方法2:自顶向下的视角... 266 方法3:匹配主机名... 267 观察... 268 使用固化分组和占有优先量词... 268 简单的消除循环的例子... 270 消除C语言注释匹配的循环... 272 流畅运转的表达式... 277 引导匹配的工具... 277 引导良好的正则表达式速度很快... 279 完工... 281 总结:开动你的大脑... 281 第7章:Perl 283 作为语言组件的正则表达式... 285 Perl的长处... 286 Perl的短处... 286 Perl的正则流派... 286 正则运算符和正则文字... 288 正则文字的解析方式... 292 正则修饰符... 292 正则表达式相关的Perl教义... 293 表达式应用场合... 294 动态作用域及正则匹配效应... 295 匹配修改的特殊变量... 299 qr/…/运算符与regex对象... 303 构建和使用regex对象... 303 探究regex对象... 305 用regex对象提高效率... 306 Match运算符... 306 Match的正则运算元... 307 指定目标运算元... 308 Match运算符的不同用途... 309 迭代匹配:Scalar Context,不使用/g. 312 Match运算符与环境的关系... 316 Substitution运算符... 318 运算元replacement 319 /e修饰符... 319 应用场合与返回值... 321 Split运算符... 321 Split基础知识... 322 返回空元素... 324 Split中的特殊Regex运算元... 325 Split中带捕获型括号的match运算元... 326 巧用Perl的专有特性... 326 用动态正则表达式结构匹配嵌套结构... 328 使用内嵌代码结构... 331 在内嵌代码结构中使用local函数... 335 关于内嵌代码和my变量的忠告... 338 使用内嵌代码匹配嵌套结构... 340 正则文字重载... 341 正则文字重载的问题... 344 模拟命名捕获... 344 效率... 347 办法不只一种... 348 表达式编译、/o修饰符、qr/···/和效率... 348 理解“原文”副本... 355 Study函数... 359 性能测试... 360 正则表达式调试信息... 361 结语... 363 第8章:Java. 365 Java的正则流派... 366 Java对\p{…}和\P{…}的支持... 369 Unicode行终结符... 370 使用java.util.regex. 371 The Pattern.compile() Factory. 372 Pattern的matcher方法... 373 Matcher对象... 373 应用正则表达式... 375 查询匹配结果... 376 简单查找-替换... 378 高级查找-替换... 380 原地查找-替换... 382 Matcher的检索范围... 384 方法链... 389 构建扫描程序... 389 Matcher的其他方法... 392 Pattern的其他方法... 394 Pattern的split方法,单个参数... 395 Pattern的split方法,两个参数... 396 拓展示例... 397 为Image Tag添加宽度和高度属性... 397 对于每个Matcher,使用多个Pattern校验HTML. 399 解析CSV文档... 401 Java版本差异... 401 1.4.2和1.5.0之间的差异... 402 1.5.0和1.6之间的差异... 403 第9章:.NET. 405 .NET的正则流派... 406 对于流派的补充... 409 使用.NET正则表达式... 413 正则表达式快速入门... 413 包概览... 415 核心对象概览... 416 核心对象详解... 418 创建Regex对象... 419 使用Regex对象... 421 使用Match对象... 427 使用Group对象... 430 静态“便捷”函数... 431 正则表达式缓存... 432 支持函数... 432 .NET高级话题... 434 正则表达式装配件... 434 匹配嵌套结构... 436 Capture对象... 437 第10章:PHP.. 439 PHP的正则流派... 441 Preg函数接口... 443 “Pattern”参数... 444 Preg函数罗列... 449 “缺失”的preg函数... 471 对未知的Pattern参数进行语法检查... 474 对未知正则表达式进行语法检查... 475 递归的正则表达式... 475 匹配嵌套括号内的文本... 475 不能回溯到递归调用之内... 477 匹配一组嵌套的括号... 478 PHP效率... 478 模式修饰符S:“研究”. 478 扩展示例... 480 用PHP解析CSV.. 480 检查tagged data的嵌套正确性... 481 索引...... 485
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值