深入正则表达式(三)

现在来谈谈正则表达式的一些细节的问题。

一.先来谈谈匹配模式

1.不区分大小写的匹配模式

2.宽松的排列和注释模式

3.点号通配模式也叫单行模式

4.增强的行锚点模式也叫多行模式

5.文本模式



1.不区分大小写,在各个语言中的表示方法都不一样,但是原理是一样的。如常用 (?i)表示不区分大小写的开头,用(?-i)表示不区分大小写的结尾。如 (?i)very(?-i)good 来匹配 verygood 是能成功的,来匹配VErygood也是能常用的。这一点很简单,相信大家都能明白。我要说的一点是,当只有(?i),没有有(?-i)符号是,表达式匹配一样字符的结尾,也就是哪一样都不区分大小写。常能改变一些元字符的匹配规则。对于不同的语言,可能一些封装不一样。如java.util.regex中,用Pattern.CASE_INSENSITIVE,来表示不区分大小写格式。



2.宽松的排列和注释模式,常用(?x),宽松的注释模式。在此不作详细介绍。



3.点号通配模式也叫单行模式,指的是.号的匹配方式,它在通常情况下只能匹配换行符之前的位置。不能进行多行的匹配。若使用单行模式,能匹配多行的情况。包括换行符。(?s)常用的匹配字符。



4. 增强的行锚点模式也叫多行模式(?m)。

锚点^匹配需要搜索的文本起始位置, 如果使用增强的行锚点匹配模式,它还能匹配每个换行符之后的位置。在某些系统中,增强谋士下,^还能匹配Unicode的终结符。

\A 总是能够匹配待搜索文本的起始位置。

\Z 通常是字符串的末尾位置,或者在字符串末尾的换行符之前的位置。

\z 总是匹配字符串末尾

5.文本模式 \Q……\E,把其中的字符全部当做文本来处理。注意java.util.regex中只在1.6(含)之后的版本起作用。

模式对于正则表达式的匹配有很到的影响。常常会改变正则表达式员字符的匹配规则。


  二、写正则表达式的设计原则:

1. 只匹配期望的文本,排除不期望的文本。

2. 必须易于控制和理解

3. 如果使用NFA引擎,必须保证效率。

三、常见的几个正则表达式。

1. 匹配多行文本 ^\w+=([^\n\\] | \\.)* 其中的 \\.能匹配反斜线加换行符的结合体

2 匹配IP地址的每一段的数字:[01]?\d\d? | 2[0-4]\d | 25[0-5] 完整的匹配字符:

(?<![\w.])([01]?\d\d? | 2[0-4]\d | 25[0-5] )\.([01]?\d\d? | 2[0-4]\d | 25[0-5] )\.([01]?\d\d? | 2[0-4]\d | 25[0-5] )\.([01]?\d\d? | 2[0-4]\d | 25[0-5] )(?![\w.])

3. 匹配对称的括号:\([^()]*\)从一个开括号到最近的闭括号,但是不容许其中包含开括号

4. 匹配一个数:^-?([0-9]+(\.[0-9]*)? | \.[0-9]+)$

5. 去除文本首尾的空白字符perl语言实现:s/^\s*((?:.*\S)?)\s*$ /$1 /s 简单解释一下perl中s/ a/b /s是替换结构,把a替换成b结尾的s是不区分大小写,也就是前面提到的不区分大小写模式。

还有其中的$1是指的是((?:.*\S)?),它是正则表达式中的分组问题。它按括号进行分组,每当正则表达式中的出现一组括号,正则引擎就进行记录一组值,把括号中的值给隐性记住。这样就可以以便以后访问。

$1就是指的分组号为1的那一组内容,或许你要问,表达式中不是出现两组括号吗?那你要去前面看看?:的意思,?:它是告诉正则引擎不用记住这组括号的分组号和分组值。也就是告诉正则引擎那组括号不起作用。

其实从这一分组中,我们也能看到一些正则表达式的优化内容,那就是不要滥用括号,不要让引擎记住太多的内容。还有一点就是可以用?:让正则引擎不记住括号的内容。这两点也是常用的优化正则表达式的手段。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值