正则表达式(Regular Expressions)
正则表达式在其他编程语言中的应用非常广泛,网上资料也非常多,而网上在ABAP语言中应用的资料却很少,尽管各语言中正则表达式语法知识都很类似,但仍然有一些区别,本文主要是简单介绍一下其基本语法。总结一下,方便大家查阅。
欢迎转载,请注明出处,文中不足之处还望指正。(Email:hubin0809@126.com)
一、简要认识
正则表达式就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如表达式“ab+” 描述的特征是“一个 'a' 和任意个 'b' ”,那么 'ab','abb','abbbbbbbbbb' 都符合这个特征。
正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。
举例
DATA:matcherTYPEREFTOcl_abap_matcher, |
输出结果:X |
解释:
1> '\w+@\w+(\.\w+)+'中 \w 是表示任意一个字母或数字或下划线,+ 表示前面字符个数为一个或多个,@即为’@’字符
2> matcher参照类cl_abap_matcher,match有匹配的意思,调用静态方法create创建了匹配的对(暂时这么理解,好吧,我承认我不知道怎么形容),然后调用match方法,返回值中’X’表示匹配,SPACE表示不匹配。
具体含义后面会讲到,本程序主要是验证邮件地址是否合法。
二、语法规则
pattern模板,text要匹配的字符,match匹配结果,’X’表示匹配,SPACE表示不匹配。
1、普通字符
字母、数字、汉字、下划线、以及后面没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
Pattern |
Text |
Match |
A |
X |
|
a |
- |
|
AB |
X |
2、转义字符
一些不便书写的字符,采用在前面加 "\" 的方法。例如’.’
表达式 |
可匹配 |
\\ |
代表 "\" 本身 |
\. |
匹配小数点(.)本身 |
\Q...\E |
中间的字符作为普通字符 |
Pattern |
Match |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.\. |
f. |
X |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
f\f |
- |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
\w\d |
\w\d |
\\w\\d |
\Q\w\d\E |
3、能够与 '多种字符'匹配的表达式
正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。(没玩过?好吧,去玩qq够级吧,ok,信息泄露了,承认我是山东人)
\d |
9 |
25 |
- |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
\d\d |
\w |
\s |
\n |
... |
4zF |
4、自定义能够与 '多种字符'匹配的表达式
使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。
[abc] |
abc |
[^abc]b |
cb |
[a-g]b |
5、支持的 POSIX字符集合
个人感觉意义不大,可能对一些控制字符有用吧,了解。
[[:alnum:]] |
[:lower:][:digit:] |
a9 |
[[:lower:][:digit:]] |
b |
6、修饰匹配次数的特殊符号
前面讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配,否则会累死的。
[abc]{3} |
bca |
.{3,5} |
abcd |
\d{5,} |
12345 |
a*b |
a+b |
- |
7、其他一些代表抽象意义的特殊符号
^
与字符串开始的地方匹配,不匹配任何字符
$
与字符串结束的地方匹配,不匹配任何字符
\b
匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
|
左右两边表达式之间 "或" 关系,匹配左边或者右边
( )
(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
(?: )
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。
举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"。
举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"。
举例3:表达式 ".\b." 在匹配 "@@@abc" 时,能够找到匹配的内容;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。
举例4:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,能够找到匹配的内容;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。
Pattern |
Match |
||||||||
(.{1,3})|(.{5,}) |
bcade |
三、正则表达式中的一些高级规则(ABAP部分支持)
1、 匹配次数中的贪婪与非贪婪贪婪模式: 在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}","{m,}","?","*","+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:
由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这种匹配原则就叫作 "贪婪" 模式 。 非贪婪模式:(ABAP暂时不支持,但是最好理解吧) (d)(\w+?) |
"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x" |
||||||
(d)(\w+?)(d) |
为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx" |