正则表达式的元字符和转义字符,又及转义字符和ASCII码之间的关系小解

1、正则表达式的组合

正则表达式由元字符和转义字符组成

元字符有

  • ^ :断言目标的开始位置(或多行模式下的行首位置)
  • $ :断言目标的介绍位置(或多行模式下的结尾位置)
  • . :匹配除换行符外的其他任何字符
  • [ :匹配字符类定义
  • ] :介绍内字符定义
  • | :开始一个可选分支
  • ( :子组的开始标记
  • ) :子组的结束标记
  • ? :作为量词表示0次或多次,若位于量词之后则是用于改变量词的贪婪特性
  • * :量词0次或多次匹配
  • + :量词1次或多次匹配
  • { :自定义量词的开始标记
  • } :自定义量词的结束标记

转义字符有

  • \f

    换页(FF),将当前位置移到下页开头
    十进制码是:012,八进制码是:\014,十六进制是:\x0e
  • \n

    换行(LF) ,将当前位置移到下一行开头
    十进制码是:010,八进制码是:\012,十六进制是:\x0c
  • \r

    回车(CR) ,将当前位置移到本行开头
    十进制码是:013,八进制码是:\015,十六进制是:\x0d
  • \t

    水平制表(HT) (跳到下一个TAB位置)
    十进制码是:009,八进制码是:\011,十六进制是:\x09
  • \\

    代表一个反斜线字符'\'
    十进制码是:092,八进制码是:\134,....
  • \'

    代表一个单引号(撇号)字符
    十进制码是:039,八进制码是:\047
  • \"

    代表一个双引号字符
    十进制码是:034,八进制码是:\042
  • \?

    代表一个问号
    十进制码是:063,八进制码是:\077
  • \0

    空字符(NUL)
    十进制码是:000,八进制码是:\000
       
    
说到了转义字符,现在解释一下转义字符和ASCII之间的关系:

2、ASCII码
我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。
ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。
\x表示后面的字符是十六进制数,\0表示后面的字符是八进制数。
所有的ASCII码都可以用“”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如0,t,n等部分特殊字符,就称为转义字符,因为后面的字符,都不是八进制数字了,所以也就不是ASCII字符意思了,算定义的一些特殊字符来表示吧。

常用的ASCII码

  • a-z : 十进制码是97-122,八进制码是141-172,"\141" === "a" && "\141" === "\a" ->true
  • A-Z : 十进制码是65-90,八进制码是101-132, "\101" === "A" && "\101" === "\A" -> true
  • 0-9 : 十进制是48-57,八进制码是060-071,"\060" === "0" && "\060" === "\0" ->true
  • 不常用的ASCII码,在上面正则组成部分中有写。
现在解释ASCII和正则匹配中的转义字符之间的关系:

其实ASCII中的转义字符和正则中的转义字符是同一样东西,都是特殊意义的字符,也算对ASCII中一些特殊字 符或不能显示的字符的定义或别称。因为ASCII的应用场景可以是任何地方,所以转义字符也可以用于正则匹配中,甚至可以将对转义字符或匹配规则中非元字符的字符用八进制或十六进制的编码转换后用于正则匹配中,哈哈

例子:
/\141/.test("acdf"); ->true 匹配"a"
/\134/.test("a\\f"); ->true 匹配"\"
/[\141-z]/.test("a141"); ->true 匹配a-z中的任意一个字符
/b\077/.test("a"); ->true 匹配是否有b或没有字符 "\077" === "?" ->true

其实当字符串进行大小比较时,也是比较的首字母的ASCII大小
"a" > "A" ->true 相当于 97 > 65 也相当于 "\141" > "\101" 也相当于 "\x61" > "\x41"
"a" > "'" ->true 相当于 97 > 39 也相当于 "\141" > "\047"
等等其他匹配
最后在讲讲其他具体编程语言中转义字符串

具体编程语言中有一些特殊标志字符,会当成编程语言中的标志符号来识别,所以需要转义字符来识别,例如:如HTML转义符、java 转义符、xml 转义符、 oracle 转义符、sql 转义符 、sqlserver 转义符、php 转义符、asp 转义符、vb转义符、 javascript 转义符等等,还有网址中的百分号。作用环境当然是对应的编程语言中。

转义字符串(Escape String),即字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand第二部分是实体(Entity)名字或者是#加上实体(Entity)编号第三部分是一个分号

例如 HTML中的 > < © & " 空格 -> &gt;&lt;&copy;&amp;&quot;&nbsp; 
例如url中的 空格,?,+,\,&.... -> (十六进制的)%20 %3F %2B %5C %26当然也可以用第二块的ASCII中八进制或十六进制码 
encodeURIComponent(" ")-> %20
encodeURIComponent("?")-> %3F
encodeURIComponent("\077")-> %3F
....
decodeURIComponent("%3F")-> "?"
decodeURIComponent("\077")-> "?"
decodeURIComponent("%5C")-> "\"
decodeURIComponent("\134")-> "\"
此处想说ASCII码真的是随处可用

详细可参考HTML转义字符对照表

总结:
1:将普通字符转为特殊用途,一般是针对所有编程语言中,用于表示不能直接显示的字符,比如后退键,回车键,等。
2:用来将特殊意义的字符转换回它原来的意义。一般用具体的编程语言环境中。例如HTML转义符、php 转义符、xml 转义符,java转义符,或正则表达式中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此工具我不再更新,里面大多数方法我迁移到了hutool工具包中,而其中一些不常用的功能被遗弃,项目暂留做为以后参考。 common-tools 一、数据库工具类 1、com.baijob.commonTools.db.ds C3p0Ds 和 DruidDs分别是两种连接池的实现,依赖于数据库配置文件,配置文件的样例参考config/db-example.setting 使用时将db-example.setting复制于${classpath}/config/db.setting,按照配置文件中的说明替换相应值 如果使用Druid,则需参考druid-example.setting创建${classpath}/config/druid.setting文件,详情请参考官方文档 使用C3P0则需要参考c3p0-config-example.xml创建${classpath}/c3p0-config.xml来调节C3P0参数 此时即可调用C3p0Ds.getDataSource()或DruidDs.getDataSource()方法获得默认的数据源 如果要自定义数据库配置文件的参数,请调用相应的init(),传入相关参数 注:Setting对象请参考与之对应的章节 2、com.baijob.commonTools.db.DbUtil 数据库工具类,提供了关闭方法:关闭可以传入多个参数,关闭的顺序是按照参数的顺序来的,用于一次性关闭Connnection、Statement、ResultSet等 newSqlRunner方法用于快速新建一个SqlRunner(此类介绍参考下问) 3、com.baijob.commonTools.db.DsSetting,用于读取db.setting文件辅助类,内部使用 4、com.baijob.commonTools.db.SqlRunner类参考Apache的DbUtils工具包,封装了常用的增删改查方法,与com.baijob.commonTools.db.RsHandler配合使用 com.baijob.commonTools.db.RsHandler接口与Apache的DbUtils的ResultSetHandler等价,抽象结果集处理。 二、邮件工具类 1、com.baijob.commonTools.mail.MailAccount 邮件账户类。 可以调用MailAccount(String accountSettingFileBaseClassLoader)读取相对路径的Setting文件,配置参考mailAccount-example.setting 2、com.baijob.commonTools.mail.MailUtil邮件发送工具类,方法请参考注释 此工具类依赖javax.mail,请参考pom.xml添加依赖或手动下载 三、网络相关工具类 1、com.baijob.commonTools.net.AccessControl访问控制,基于配置文件,可以设定IP白名单或黑名单,可以通过配置文件实现简单的账户验证。 配置文件请参考access-example.xml 2、com.baijob.commonTools.net.Connector 连接对象实体类,有host、端口、用户名、密码等属性 3、com.baijob.commonTools.net.HtmlUtil HTML工具类,暂时只提供特殊字符转义 4、com.baijob.commonTools.net.SocketUtil socket工具类。 isUsableLocalPort() 检测本地某个端口是否可用(可用是指没有被其他程序占用) isValidPort()是否是符合规范的端口号 longToIpv4()将long转换为ipv4地址,反方法是ipv4ToLong() netCat()简易的数据发送方法 5、com.baijob.commonTools.net.SSHUtil SSH相关工具类 getSession()获得一个SSH会话 bindPort()将远程主机的端口映射到本地某个端口 6、com.baijob.commonTools.net.URLUtil 将相对、绝对路径转换为URL对象,用于网络或文件流的读写,Setting的配置依赖此工具包 四、线程相关工具类 1、com.baijob.commonTools.thread.BaseRunnable 此类实现了Runnable接口,扩展了功能。 增加名称、ID,调用次数和时间统计、线程停止接口等,并且在线程运行时,不允许此线程第二次启动。 2、com.baijob.commonTools.thread.Executor 线程池工具类 调用静态方法execute()启动线程,此线程在公共的线程池中执行 若想自定义线程池大小或独立控制,可调用newExecutor()实例化一个线程池 excAsync()执行一个异步方法 3、com.baijob.commonTools.thread.SyncQueue 阻塞队列,简化了JDK的BlockingQueue

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值