原文发布时间: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 |
[ ] |
“-”来指定字符的区间,还可以制定多个区间,例如正则表达式[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使用则会报错。