FME中的正则表达式

原文发布时间:2012-05-31

作者:毛毛虫

转换器StringReplacer和转换器StringSearcher会用到正则表达式。

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

转换器StringReplacer和转换器StringSearcher支持高级正则表达式。

对于特定字符和它们含义的说明: 

特殊字符

说明

示例

|

指明两项之间的一个选择

(him|her),匹配him或her

*

 匹配前面的子表达式零次或多次。

Ab*c,能匹配A与c间含有零到任意多的b的字符串,如Ac、Abc、Abbc……

+

匹配1或多个正好在它之前的那个字符。

a9+,能匹配a9、a99……,但不匹配a

?

匹配0或1个正好在它之前的那个字符。

a9?,能匹配a、a9、a99……

.

 匹配任何单个字符。

r.t,能匹配rat、rut……

^

匹配一行的开始。

^When in,能匹配When in the course of human events

$

匹配行结束符。

weasel$ ,能够匹配字符串He's a weasel

[ ] 
[c1-c2] 
[^c1-c2]

“-”来指定字符的区间,还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,

例如正则表达式[0-9]可以匹配任何数字字符;正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。

( )

封闭一个‘子表达式’——匹配放置在_matched_parts{}列表属性中的每个子表达式

正则表达式^([0-9]*)&([0-9]*)$,匹配使用‘&’分隔的整数,把第一个数字放在_matched_parts{0}中,第二个数字放在_matched_parts{1}中,如对123&456,_matched_parts{0}=123,_matched_parts{1}=456

注意符号“[ ]”在正则表达式中用法[^0-9-a-z-A-Z]和[0-9-a-z-A-Z]都是正确的,但是在FME中使用会报错:

2012-05-21 13:45:55|   0.3|  0.0|ERROR |Illegal operator `@Tcl2 -- failed to evaluate expression `86427504_da0f_461a_ba17_4a7594e4fdb05_doGrep {<openbracket>^0-9-A-Z<closebracket>} ' -- couldn't compile regular expression pattern: invalid character range' supplied for use in TestFactory -- operator must be one of < > <= >= != = ==

正确的写法是:[^0-9a-zA-Z]和 [0-9a-zA-Z]

使用正则表达式替换时是字符替代的:若有一个属性attr=‘1aZ’使用StringReplacer(设置替换值为+) 时,正则表达式[0-9-a-z-A-Z]表示与对每个符合条件的字符进行替代,设置后执行后的结果是attr=‘+++’;而[0-9][a-z][A-Z]则是满足条件的三个字符进行替代,设置后执行后的结果为attr=‘+’。

正则表达式示例: 

^[0-9]+$

匹配数字组成的任意值

^(beef|chicken)$

匹配 “beef” 或 “chicken”

^([0-9]*)&([0-9]*)$

匹配使用‘&’分隔的整数,把第一个数字放在_matched_parts{0}中,第二个数字放在_matched_parts{1}中

^N([0-9][0-9])[.]([0-9][0-9])[.]([0-9][0-9])

匹配 N23.45.11,将23 放入 _matched_parts{0}, 45 放入 _matched_parts{1}, 11 放入 _matched_parts{2}

正则表达式也可以包含任意转义符,如下表指定的。如果没有在下表中列出,反斜杠符号会被忽略。如,在 StringSearcher转换器中设置正则表达式为^(beef|chicken)$,属性attr=beef和attr=be\ef都是可以与该正则表达匹配的。

序列

描述

\a

报警字符 (bell) (0x07)

\b

退格 (0x08)

\f

换页符(0x0c)

\n

换行符(0x0a)

\r

回车(0x0d)

\t

制表(0x09)

\v

垂直制表符 (0x0b)

\\

反斜杠

(注意:如果只输入一个反斜杠,这个反斜杠会转义为转义反斜杠

如:[^\^]匹配除了^以外的所有字符。

正则表达式的大小写受大小写敏感(Case insensitive)参数的影响。

掌握正则表达式,可以快速的完成字符的查找或替换,从而节省时间。但是也要注意,正则表达式根据开发环境的不同会有细微的差别,需要仔细阅读分析FME中对正则表达式的语法要求,否则可能会导致错误。如匹配任意字符的正则表达式 [\s\S]*、 [\d\D]*或[\w\W]*,在转换器StringReplacer和转换器StringSearcher使用则会报错。




猜你喜欢

转载自blog.csdn.net/fmechina/article/details/80985451