现在来谈谈正则表达式的一些细节的问题。
一.先来谈谈匹配模式
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的那一组内容,或许你要问,表达式中不是出现两组括号吗?那你要去前面看看?:的意思,?:它是告诉正则引擎不用记住这组括号的分组号和分组值。也就是告诉正则引擎那组括号不起作用。
其实从这一分组中,我们也能看到一些正则表达式的优化内容,那就是不要滥用括号,不要让引擎记住太多的内容。还有一点就是可以用?:让正则引擎不记住括号的内容。这两点也是常用的优化正则表达式的手段。
一.先来谈谈匹配模式
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的那一组内容,或许你要问,表达式中不是出现两组括号吗?那你要去前面看看?:的意思,?:它是告诉正则引擎不用记住这组括号的分组号和分组值。也就是告诉正则引擎那组括号不起作用。
其实从这一分组中,我们也能看到一些正则表达式的优化内容,那就是不要滥用括号,不要让引擎记住太多的内容。还有一点就是可以用?:让正则引擎不记住括号的内容。这两点也是常用的优化正则表达式的手段。