找回密码
 加入
搜索
查看: 24391|回复: 46

[原创] StringRegExp 函数参考中文版——包括 StringRegExp & Replace 测试工具!

 火.. [复制链接]
发表于 2008-6-23 13:23:02 | 显示全部楼层 |阅读模式
StringRegExp 函数的重要性就不必多说了吧?可惜AutoIt 汉化版中此函数的帮助没有翻译。
昨天我花了整整一天时间,终于将它翻译完了。为了能够正确的表述,使用的是意译,而且里面也一定存在表述不清、错误等情况,所以:
希望大家能群策群力,修正、补充、完善本帮助!
同时也希望汉化版也能早日更新帮助文件!
StringRegExp 
=============
StringRegExp ( "test", "pattern" [, flag ] [, offset ] ])
    检验一个字符串是否适合某一特定的正则表达式模式。
        test        被检验字符串
        pattern        正则表达式模式
        flag        [可选],决定返回方式,默认为0
        offset        [可选],开始检验的位置,默认为1,即从头开始

flag 值
        0        返回 1 (匹配)或 0 (无匹配)
        1        返回数组型匹配
        2        同 1,包含所有匹配(Perl / PHP方式)
        3        同 1,返回值为匹配的全部
        4        同 2 + 3

@Error
======= 
Flag = 0:
        2        正则表达式错误。@Extended=表达式中出错的位置
Flag= 1 或 2:
        0        数组有效。@Extended=下一个位置
        1        无匹配,数组无效。
        2        表达式错误,数组无效。@Extended=表达式中出错的位置
Flag = 3 或 4:
        0        数组有效
        1        无匹配,数组无效
        2        表达式错误,数组无效。@Extended=表达式中出错的位置

注意
=====
    正则表达式是一种精炼的字符串表达方式,表达式使用特殊意义的字符组合,匹配目标字符串中的特定字符组合。Autoit 的正则表达式通常是大小写敏感的。

    正则表达式由下面所列的一个或多个简单的规则组成,如果某字符没有存在于下列表格中,那么该字符将只能匹配其自身。

    次数修饰符(*, +, ?, {...}) 将尝试最大可能的匹配,使第一次匹配之后的字符也能得到匹配,除非前面是 ?,?... 使用最小匹配模式。

    表达式允许嵌套,但请注意,除了没有匹配值的表达式,在返回的数组中,里面的表达式匹配的值在前,而外面的表达式匹配的值在后。

    完整的说明可以在这里找到:http://www.autoitscript.com/autoit3/pcrepattern.html

注意:错误的正则表达式可能导致死循环,甚至崩溃。

匹配字符
=========
[...]                匹配[]内的任何字符。如 [aeiou] 匹配任何小写元音字母。可以使用破折号定义起始和结束字符匹配字符集,如 [a-Z] 匹配任何小写字母;又如 [][] 可以匹配 [or]。要注意的是,[]内的特殊字符需要使用转义符 \ 来匹配自身,比如:\\,\^,\-,\[,\]
[^...]                匹配 "..." 外的任何字符。如: [^0-9] 匹配任何非数字。同上,如果是需要匹配字符 "^",则需要使用转义符,如 \^
[:class:]        :class: 代表字母类匹配符,其匹配内容请参考下文
[^:class:]        匹配 :class: 之外的字符,but only if the first character.
(...)                组内的元素在匹配时将被一起考虑,如 (ab)+ 将匹配 "ab" 或 "abab" 等,但不会是 "aba"。根据 Flag 的定义,组可以用数组存储匹配的文本,以便之后调用。
(?i)                大小写不敏感标志,这不是组,而是告诉引擎从此处开始的匹配不区分大小写
(?-i)                (默认)大小写敏感标志,同样不是组,而是告诉引擎从此处开始的匹配区分大小写
(?i...)                大小写不敏感组,组内元素不区分大小写,其它同普通组
(?-i...)        大小写敏感组,组内元素区分大小写,其它同普通组。主要用在 (i) 后面或者 (?i...) 内
(?:...)                不用捕获的组。类似普通组,只是输出匹配数组也不返回用于 back-referencing 的匹配文字
(?i:…)                同上,但不区分大小写
(?-i:...)        同上,但区分大小写
(?m)                同^ 和 $ ,仅匹配行内数据
(?s)                同 . ,匹配行内的任何数据("." 默认不匹配换行符)
(?x)                忽略空格和 # 注释
(?U)                非贪婪模式
.        除换行符外的任何字符
|        或,用前或后侧表达式匹配
\        转意符,让元字符匹配自身,或使字符代表特殊功能(见下文)
\\        实际反斜线( \)
\a        警告,即字符 BEL (chr(7))
\A        只匹配字符串开始处
\b        匹配词的边界(头或尾)
\B        匹配词边界以外的区域
\c        根据下一字符匹配 ASCII 控制符,如 \cM 匹配 Ctrl-M
\d        匹配数字(0-9)
\D        匹配非数字
\e        匹配 Escape (chr(27))
\E        区域终点,需组合使用
\f        匹配换页符 (chr(12))
\h        横向空白字符如 Tab
\H        非横向空白字符
\l        下一字符为小写
\L        匹配时 \L...\E 区域内字符转小写
\n        匹配换行符(@LF,chr(10))
\Q        \Q(...)...\E,忽略()内元字符的功能
\r        匹配回车(@CR,chr(13))
\s        匹配任何空白字符:chr(9)-chr(13),即横向Tab,换行符,垂直Tab,换页符,回车,空格(chr(32))
\S        匹配任何非空白字符
\t        匹配制表符(chr(9))
\u        下一字符为大写
\U        匹配时 \U...\E 区域内字符转大写
\v        垂直空白字符
\V        非垂直空白字符
\w        匹配a-z,A-Z,0-9,以及_(下划线)
\W        匹配 \w 以外的字符
\###        匹配由 3 个8进制组成的 ASCII 字符,可匹配 ASCII 字符及 back-reference,如 ([:alpha:])\1 匹配 - (连字符)
\x##        匹配由 2 个16进制数组成的 ASCII 字符
\z        匹配字串尾部
\Z        同上,但可用于多行时匹配行尾

次数修饰符
===========
{x}        重复匹配 x 次
{x,}        重复匹配次数 >= x
{0,x}        重复匹配 0 到 x 次
{x,y}        重复匹配 x 到 y 次
*        ={0,},即重复匹配次数 >= 0
+        ={1,},即重复匹配次数 >= 1
?        ={0,1},即重复匹配 0 到 1 次
?...        匹配 "..." 的最小匹配可能

字母类匹配符
=============
[:alnum:]        字母和数字 
[:alpha:]        字母 
[:ascii:]        0 - 127 内的 ASCII 字符
[:blank:]        空格和制表符
[:cntrl:]        控制字符
[:digit:]        数字(同 \d)
[:graph:]        可打印字符,不包括空格
[:lower:]        小写字母
[:print:]        可打印字符,包括空格
[:punct:]        字母和数字以外的打印字符
[:space:]        空白字符(不同于 \s,它包括 VT(chr(11)))
[:upper:]        大写字母
[:word:]        字(同 \w)
[:xdigit:]        16进制数
[ 本帖最后由 pw4321 于 2008-6-30 22:04 编辑 ]

评分

参与人数 7金钱 +80 贡献 +30 收起 理由
amgloon + 5 谢谢啊.
bob + 5 一直想翻译此文章,无奈能力有限!
lsq726 + 5 精品文章
qop1830 + 10 + 5 偶滴神拉---这是贡献!
破帽遮颜 + 10 精品文章

查看全部评分

发表于 2008-6-23 17:40:38 | 显示全部楼层
沙发啊!
  谢谢楼主,学习了!
 楼主| 发表于 2008-6-24 14:36:32 | 显示全部楼层
修正几处错误:
1.(?:...)        非获取匹配组,匹配 ... 但只用于确定位置而不返回匹配结果,同样也不会返回 \i
2. \###        匹配8进制值为 ### 的 ASCII字符,可匹配 ASCII字符及 \i ,如 ([:alpha:])\1 匹配 - (连字符)
3.\x##        16进制值为 ## 的ASCII字符,如:\x311 匹配 11
补充说明:
\i 或 $i        前面第i个子表达式 () 匹配的捕获,i=1,2,3...
        如:<t(.*?)>caption<\/\1> 可匹配 <title>caption</title>
        但更多是用于 Replace

评分

参与人数 2金钱 +20 收起 理由
qop1830 + 10 拿去买糖!!
kakinkgb + 10

查看全部评分

发表于 2008-6-24 16:06:26 | 显示全部楼层
牛。。。。。。。。。。。
 楼主| 发表于 2008-6-28 23:43:34 | 显示全部楼层
修正:
\Q        \Q(...)...\E,忽略()内元字符的功能
=>
\Q        \Q...\E,忽略 ... 内所有元字符的功能
        \Q(.)\E 将匹配连在一起的:(.)
[ 本帖最后由 pw4321 于 2008-6-30 21:37 编辑 ]

评分

参与人数 1金钱 +5 收起 理由
lsq726 + 5

查看全部评分

 楼主| 发表于 2008-6-30 21:42:17 | 显示全部楼层
AutoIt3正则表达式检测工具:

#NoTrayIcon
Opt("MustDeclareVars", 1)
Local $Test, $Pattern, $Replace, $Flag = 0, $Offset = 1, $Count = 0
Local $Ip1, $Ip2, $Ip3, $Ip4, $Lb1, $Lb2, $Bt1, $Bt2, $Mode="匹配模式"
GUICreate("AutoIt3 正则表达式",300,160)
GUICtrlCreateLabel("测试字符串:",10,13,70,20)
$Ip1=GUICtrlCreateInput($Test,80,10,210,20)
GUICtrlCreateLabel("匹配表达式:",10,43,70,20)
$Ip2=GUICtrlCreateInput($Pattern,80,40,210,20)
$Lb1=GUICtrlCreateLabel("  输出标志:",10,73,70,20)
$Ip3=GUICtrlCreateInput($Flag,80,70,210,20)
$Lb2=GUICtrlCreateLabel("起始位偏移:",10,103,70,20)
$Ip4=GUICtrlCreateInput($Offset,80,100,210,20)
$Bt1=GUICtrlCreateButton($Mode,50,130,80,25)
$Bt2=GUICtrlCreateButton("输出结果",170,130,80,25)
GUISetState()
While 1
        Switch GUIGetMsg()
        Case -3
                Exit
        Case $Bt1
                Switch $Mode
                Case "匹配模式"
                        $Mode = "替换模式"
                        GUICtrlSetData($Lb1, "替换表达式:")
                        GUICtrlSetData($Ip3, $Replace)
                        GUICtrlSetData($Lb2, "  替换次数:")
                        GUICtrlSetData($Ip4, $Count)
                Case "替换模式"
                        $Mode = "匹配模式"
                        GUICtrlSetData($Lb1, "  输出标志:")
                        GUICtrlSetData($Ip3, $Flag)
                        GUICtrlSetData($Lb2, "起始位偏移:")
                        GUICtrlSetData($Ip4, $Offset)
                EndSwitch
                GUICtrlSetData($Bt1,$Mode)
        Case $Bt2
                Local $Return = ""
                $Test = GUICtrlRead($Ip1)
                $Pattern = GUICtrlRead($Ip2)
                If NOT ($Test AND $Pattern) Then ContinueLoop
                Switch $Mode
                Case "匹配模式"
                        ; GUICtrlRead() 获取的是字符,使用 IsInt() 判断时总是得到结果 0
                        $Flag = GUICtrlRead($Ip3)
                        If NOT StringRegExp($Flag, "^[0-4]$") Then
                                MsgBox(16, "错误", "输出标志只能是 0-4 之间的整数!")
                                ContinueLoop
                        EndIf
                        $Offset = Number(GUICtrlRead($Ip4))
                        If StringRegExp($Offset, "^[1-9]\d*$") Then
                                MsgBox(16, "错误", "起始位偏移只能是 1 以上的整数!")
                                ContinueLoop
                        EndIf
                        Dim $_Return = StringRegExp($Test,$Pattern,$Flag,$Offset)
                        If IsArray($_Return) Then
                                For $i In $_Return
                                        $Return &= $i & @LF
                                Next
                        Else
                                $Return = $_Return
                        EndIf
                        Switch $Flag
                        Case 0
                                Switch @error
                                Case 0
                                        If $Return Then
                                                MsgBox(0, "结果", "存在可匹配字符!")
                                        Else
                                                MsgBox(0, "结果", "无匹配!")
                                        EndIf
                                Case 2
                                        MsgBox(16, "错误", "匹配表达式第 " & @extended & " 位无效")
                                Case Else
                                        MsgBox(16, "错误", "@error=" & @error &@LF& "@Extended=" & @extended)
                                EndSwitch
                        Case 1 To 4
                                Switch @error
                                Case 0
                                        MsgBox(0, "结果", "匹配结果为:" &@LF& $Return &@LF& "@Extended=" & @extended)
                                Case 1
                                        MsgBox(16, "错误", "无匹配!")
                                Case 2
                                        MsgBox(16, "错误", "匹配表达式第 " & @extended & " 位无效")
                                Case Else
                                        MsgBox(16, "错误", "@error=" & @error &@LF& "@Extended=" & @extended)
                                EndSwitch
                        EndSwitch
                Case "替换模式"
                        $Replace = GUICtrlRead($Ip3)
                        $Count = Number(GUICtrlRead($Ip4))
                        If NOT StringRegExp($Count, "^[1-9]\d*$") Then
                                MsgBox(16, "错误", "替换次数只能是 1 以上的整数!")
                                ContinueLoop
                        EndIf
                        Dim $Return = StringRegExpReplace($Test,$Pattern,$Replace,$Count)
                        Switch @error
                        Case 2
                                MsgBox(16, "错误", "匹配表达式第 " & @extended & " 位无效")
                        Case 0
                                MsgBox(0, "结果", "替换结果为:" & $Return &@LF& "共替换了 " & @extended & " 次")
                        Case Else
                                MsgBox(16, "错误", "@error=" & @error &@LF& "@Extended=" & @extended)
                        EndSwitch
                EndSwitch
        EndSwitch
WEnd


修正了一些错误,可惜不能上传附件,我重写了一个较完整的,支持输出完整表达式的程序,代码长了点。不过这个也凑活。

[ 本帖最后由 pw4321 于 2008-7-3 00:00 编辑 ]

评分

参与人数 1金钱 +5 收起 理由
lsq726 + 5

查看全部评分

 楼主| 发表于 2008-6-30 21:46:11 | 显示全部楼层

Preview

无法上传附件:
AUTOIT CN 提示信息
附件文件无法保存到服务器,可能是目录属性设置问题,请与管理员联系。

所以也无法上传预览图了,请自己试试吧
发表于 2008-7-1 17:14:24 | 显示全部楼层
非常值得称赞!这个函数非常实用,而且正则表达式是一门高深的学问啊!
发表于 2008-7-11 06:08:50 | 显示全部楼层
    贡献!!
     
  不顶不行!·!!
发表于 2008-7-23 03:38:37 | 显示全部楼层
这个贴 强  总算 有人把 这个东西给汉化了

谢。 收藏先
发表于 2008-8-12 09:59:59 | 显示全部楼层
希望下个AU3i汉化版的帮助文件能收录进去!
发表于 2008-8-16 01:47:14 | 显示全部楼层
楼主有能力 把http://www.autoitscript.com/autoit3/pcrepattern.html 也汉化一下吧~~~~~~~~~
发表于 2008-8-29 09:59:15 | 显示全部楼层
贡献啊..收藏了.谢谢.
发表于 2008-9-26 14:08:45 | 显示全部楼层
我也来顶顶这个资料
发表于 2008-9-27 03:10:36 | 显示全部楼层
赞赞赞赞,顶爽顶爽
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 03:10 , Processed in 0.079328 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表