- 积分
- 2446
- 明经币
- 个
- 注册时间
- 2003-7-27
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
楼主 |
发表于 2012-5-30 13:29:41
|
显示全部楼层
本帖最后由 aroom 于 2012-5-30 13:32 编辑
TeaScript 中使用正则表达式
regex
语法: (regex str_pattern str_text [int_option [int_offset]])
执行一个 Perl 兼容的正则表达式 (PCRE) 查找。 str_text 给定待查找的字符串,由字符串
str_pattern 指定查找的样式。 directory, find,findAll, parse,replace, 和 search 函数
也同样支持正则表达式样式匹配。
regex 函数返回一个由已匹配的字符串、子字符串、偏移位置 和每个字符串的长度组成的列表。 如
果未能匹配,返回 nil。 偏移数值可以用于后续的处理。
此外,指定可选参数 int_option 可以用来控制正则表达式选项,后面会讲到。 附加参数
int_offset 告诉 regex 函数从指定的偏移位置开始查找, 而不是从字符串的开始处来查找。
regex 返回结果中的偏移位置和字符串长度是基于单个字节计算的。 即使 TeaScript 引擎是 UTF-8
版本编译的也是这样。
regex 同时也将系统变量 $0,$1, 和 $2— 设置为找到的表达式和子表达式。 正如 TeaScript 中
其他的符号那样, 这些变量或它们的等同表达式 ($ 0),($ 1), 和 ($ 2)— 可用在其他的
TeaScript 表达式中来进一步处理。
使用正则表达式查找的函数当未能匹配时并不会重置,不会将 $0,$1 ... $15 这些变量设为 nil。
(regex "b+" "aaaabbbaaaa") → ("bbb" 4 3)
; 不区分大小写查找选项为 1
(regex "b+" "AAAABBBAAAA" 1) → ("BBB" 4 3)
(regex "[bB]+" "AAAABbBAAAA" ) → ("BbB" 4 3)
正则表达式样式中的特殊字符
\:用作转义符。
\符号后面如果跟的是普通字符c,那么\c就代表特殊的含义,例如n本来代表字符n,但\n就代表
换行。
\符号后面如果跟的是特殊字符c,那么\c就代表普通字符c,例如\一般用作转义符,但\\则调表
普通字符\。
.:小数点中的"."号,匹配任何一个单独的字符,但是换行符除外。
(regex /a.b/ "acbaa") → ("acb" 0 3)
(regex /a.b/ "abbb") → nil
匹配"acbaa"中的"acb",但是不匹配"abbb"。
x|y:匹配x或y。注意如果x和y都匹配上了,那么只记住x。
(regex /beijing|shanghai/ "I love beijing and shanghai") → ("beijing" 7 7)
(regex /beijing|shanghai/ "I love beijing and shanghai" 0 14) → ("shanghai" 19 8)
结果匹配成功,当然shanghai也匹配。
[xyz]:xyz表示一个字符串,该样式表示匹配[]中的一个字符,形式上[xyz]等同于[x-z]。
(regex /a[bc]d/ "abddgg") → ("abd" 0 3)
结果匹配成功。
(regex /a[bc]d/ "abcd") → nil
结果匹配失败,因为[bc]表示匹配b或c中的一个,但不会同时匹配。
[^xyz]:该样式表示匹配非[]中的一个字符,形式上[^xyz]等同于[^x-z]。
(regex /a[^bc]d/ "afddgg") → ("afd" 0 3)
结果匹配成功。
(regex /a[^bc]d/ "abd") → nil
结果匹配失败。
[\b]:匹配退格键。
\b:匹配一个词的边界符,例如空格和换行符等等,当然匹配换行符时,表达式应该附加参数
m。
(regex /\bc./ "Beijing is a beautiful city") → ("ci" 23 2)
结果匹配成功,注意c前边的空格不会匹配到结果中。
\B:代表一个非单词边界。
(regex /\Bi./ "Beijing is a beautiful city") → ("ij" 2 2)
结果匹配成功。
\cX,匹配一个控制字符。
例如,\cM 匹配一个 Control-M 或 回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视
为一 个原义的 ’c’ 字符。(实际的例子还需补充)
\d:匹配一个数字字符,等同于[0-9]。
(regex /user\d/ "user1") → ("user1" 0 5)
结果匹配成功。
\D:匹配一个非数字字符,等同于[^0-9]。
(regex /user\D/ "userA") → ("userA" 0 5)
结果匹配成功。
\f:匹配一个换页符。
\n:匹配一个换行符。因为是换行符,所以在表达式中要加入m参数。
(regex /a\nbc/ "a\nbc") → ("a\nbc" 0 4)
结果匹配成功。
\r:匹配一个回车符
\s:匹配一个空格符,等同于[ \f\n\r\t\v\u00A0\u2028\u2029]。
(regex /\si/ "Beijing is a city") → (" i" 7 2)
结果匹配成功。
\S:匹配一个非空格符,等同于[ ^\f\n\r\t\v\u00A0\u2028\u2029]。
(regex /\Si/ "Beijing is a city") → ("ei" 1 2)
结果匹配成功。
\t:匹配一个tab
(regex /a\tb/ "a bc") → ("a\tb" 0 3)
结果匹配成功。
\v:匹配一个竖向的tab
\w:匹配一个数字、_或字母表字符,即[A-Za-z0-9_ ]。
(regex /\w/ "$25.23") → ("2" 1 1)
结果匹配成功。
\W:匹配一个非数字、_或字母表字符,即[^A-Za-z0-9_ ]。
(regex /\W/ "$25.23") → ("$" 0 1)
结果匹配成功。
\n:注意不是\n,这里n是一个正整数,表示匹配第n个()中的字符。
(regex /user([,-])group\1role/ "user-group-role") → ("user-group-role" 0 15 "-" 4 1)
(regex /user([,-])group\1role/ "user,group,role") → ("user,group,role" 0 15 "," 4 1)
(regex /user([,-])group\1role/ "user-group,role") → nil
结果匹配成功,同样对user,group,role的匹配也是成功的,但像user-group,role等会失
败。
\0:匹配一个NULL字符。
\xhh:匹配一个由两位16进制数字所表达的字符。
\uhhhh:匹配一个由四位16进制数字所表达的字符。
^:匹配输入字符串的起始端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行
符后匹配。
(regex /^B/ "Bab Bc ") → ("B" 0 1)
匹配字符串中的第一个B
(regex /^B/m "Badd B \ncdaf \nB dsfB") → ("B" 0 1)
匹配字符串中的第一行第一个B
(regex /^B/m "Badd B \ncdaf \nB dsfB" 0 1) → ("B" 14 1)
匹配字符串中的第三行中的第一个B
$:匹配输入字符创的尾端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符
前匹配。 与^的用法相反。
(regex /t$/ "bat") → ("t" 2 1)
(regex /t$/ "hate") → nil
匹配"bat"中的t,但是不匹配"hate"中的t
(regex /t$/m "tag at\nbat") → ("t" 5 1)
匹配字符串中的第一行最后一个t
(regex /t$/m "tag at\nbat" 0 6) → ("t" 9 1)
匹配字符串中的第二行的t
*:匹配前一个字符0次或多次。
(regex /ab*/ "dddabbbbc") → ("abbbb" 3 5)
(regex /ab*/ "ddda") → ("a" 3 1)
匹配"dddabbbbc"中的"abbbb",也匹配"ddda"中的"a"
+:匹配前一个字符1次或多次。
(regex /ab+/ "dddabbbbc") → ("abbbb" 3 5)
(regex /ab+/ "ddda") → nil
匹配"dddabbbbc"中的"abbbb",但不匹配"ddda" 与后面的{1,}(原型:{n,})的用法类似
?:?的用法比较特殊,一般来说它用来对前一个字符做0次或1次匹配,但是它有另外两种特殊的
用法:
(regex /ba*/ "bbbaaaa") → ("baaaa" 0 5)
(regex /ba*?/ "bbbaaaa") → ("b" 0 1)
如果紧跟在*、+、?和{ }之后,则表示原始匹配的最小次数匹配,例如: /ba*/本来匹
配"bbbaaaa"中的"baaaa",但是/ba*?/则匹配"bbbaaaa"中的"b"(因为*表示0次或多次匹配,而
加?应该表示最少次数匹配,即0次匹配)。
(regex /ba+?/ "baaaa") → ("ba" 0 2)
同理:/ba+?/则匹配"baaaa"中的"ba"。 作为语法结构符号,使用于前置断言中,即后面要说到
的x(?=y)和x(?!=y)
{n}:匹配前一个字符的n次出现。 n必须是一个非负数,当然如果是一个负数或小数也不会报语
法错误。
(regex /ab{2}c/ "abbcd") → ("abbc" 0 4)
结果匹配成功。
{n,m}:匹配前一个字符的至少n次最多m次的出现。只要n与m为数字,而且m>=n就不会报语法错
误。
(regex /ab{2,5}c/ "abbbcd") → ("abbbc" 0 5)
(regex /ab{2,2}c/ "abbcd") → ("abbc" 0 4)
(regex /ab{2,5}/ "abbbbbbbbbb") → ("abbbbb" 0 6)
这说明,如果前一个字符出现多于m次,则只匹配m次。
(regex /ab{2,5}c/ "abbbbbbbbbbc") → nil
结果匹配失败,因为b多于5个则b{2,5}会匹配前5个b,而表达式/ab{2,5}c/中b后面是c,但字符
串中5个b之后还是b所以会失败。
{n,}:匹配前一个字符的至少n次出现。
(regex /ab{2,}c/ "abbcdabbbc") → ("abbc" 0 4)
(regex /ab{2,}c/ "abbcdabbbc" 0 4) → ("abbbc" 5 5)
结果匹配成功。
(x):表示匹配x(并非特指字符x或者特指一个字符,x表示一个字符串),而且匹配会被记住,在
语法中这种()被称为"capturing parentheses ", 即捕捉用的小括号。 匹配会被记住,该列表
中保存所匹配的所有字符串。 另外还要注意()中的x被记住的前提是匹配x。
(regex /a(b)c/ "abcddd") → ("abc" 0 3 "b" 1 1)
从上面可以看出,/a(b)c/匹配"abcddd"中的"abc",因为()的原因,b也会记录下来。
(regex /a(b)c/ "acbcddd") → nil
返回nil,因为/a(b)c/不匹配"acbcddd",所以()中的b不会被记录下来(尽管字符串中含有b)
(?:x):匹配x,但不会记住x,这种格式中的()被称为"non-capturing parentheses ",即非捕
捉用的小括号。
(regex /a(?:b)c/ "abcddd") → ("abc" 0 3)
从上面可以看出,/a(?:b)c/匹配"abcddd"中的"abc",因为(?:)的原因,b不会记录下来。
x(?=y):匹配x,仅当后面紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。
(regex /user(?=name)/ "The username is Mary") → ("user" 4 4)
结果匹配成功。
x(?!y):匹配x,仅当后面不紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。
(regex /user(?!name)/ "The user name is Mary") → ("user" 4 4)
结果匹配成功。
(regex /\d+(?!\.)/ "54.235") → ("5" 0 1)
(regex /\d+(?!\.)/ "54.235" 0 1) → ("235" 3 3)
结果匹配成果,不匹配54是因为54后面跟着"."号,当然235也匹配。
|
|