找回密码
 加入
搜索
查看: 7061|回复: 15

[AU3基础] 正则表达式如何找出多行匹配的所有内容

  [复制链接]
发表于 2010-4-8 10:28:30 | 显示全部楼层 |阅读模式
假如有以下文本
12 34 67
A DFFD 45
C 3455 FDF
A43 3434F
435 34344 4
3434 34
A 3434 434
C 434 DF
434 FD
A 434 F
343434 df

现在在以上文本里面,只要是以A和C开头且相邻的两行,就取出来,另存为一个文本,例如从上面文本中取出:

A DFFD 45
C 3455 FDF

A 3434 434
C 434 DF

我用了正则表达式,主要脚本如下:
$chars = FileRead($file2)
$TESTabc=StringRegExp($chars,"(A\s+).*\n( C\s+).*",2,1)
FileWrite($file3,  $TESTabc[0])

但是发现只能匹配第一个。
进行多行匹配时,有什么办法可以把所有内容都找出来呢?
发表于 2010-4-8 10:42:55 | 显示全部楼层
Local $sText

$Text = '12 34 67' & @CRLF & _
                'A DFFD 45' & @CRLF & _
                'C 3455 FDF ' & @CRLF & _
                'A43 3434F ' & @CRLF & _
                '435 34344 4' & @CRLF & _
                '3434 34' & @CRLF & _
                'A 3434 434' & @CRLF & _
                'C 434 DF' & @CRLF & _
                '434 FD' & @CRLF & _
                'A 434 F' & @CRLF & _
                '343434 df'

MsgBox(0, '原字符串', $Text)

$sReg = StringRegExp($Text, 'A.+\nC.+', 3)
For $i = 0 To UBound($sReg) -1
        $sText &= $sReg[$i] & @CRLF
Next

MsgBox(0, '匹配结果', $sText)

评分

参与人数 1金钱 +20 贡献 +5 收起 理由
nmgwddj + 20 + 5 学习了,知道换行符了 哈哈

查看全部评分

发表于 2010-4-8 10:45:28 | 显示全部楼层
本帖最后由 nmgwddj 于 2010-4-8 10:54 编辑
#include <file.au3>
$i = _FileCountLines('text.txt')
For $o = 1 To $i
        $text = FileReadLine("text.txt", $o)
        $Sl = StringLeft($text, 1)
        If $Sl = 'A' Then
                $text2 = FileReadLine("text.txt", $o + 1)
                $Sl2 = StringLeft($text2, 1)
                If $Sl2 = 'C' Then MsgBox(0, '', $text & @CRLF & $text2)
        EndIf
Next
修改好的
发表于 2010-4-8 10:47:00 | 显示全部楼层
哦 我看错了。再给你写个
发表于 2010-4-8 11:10:00 | 显示全部楼层
谢谢楼上加分,客气啦!主要是LZ的问题比较简单而已。
正则处理这类问题效率确实高!
发表于 2010-4-8 11:34:13 | 显示全部楼层
想知道
For $i = 0 To UBound($sReg) -1
这句话后边的"-1"是什么意思?
发表于 2010-4-8 11:38:43 | 显示全部楼层
回复 6# nmgwddj
UBound
--------------------------------------------------------------------------------

返回数组维度的大小.

UBound ( 数组 [, 维度] )

参数

数组 要开始查询的数组变量.
维度 [可选参数] 需要报告多维数组的哪个指定维度的大小.默认值为 1,表示第一维.若此参数为0,则返回数组的下标数(维数).  

返回值

成功: 返回数组各维的大小.
失败: 返回值为0,并把 @error 设为下列数值之一:
1 = 给定的"数组"并非数组.
2 = 数组维度无效.

注意/说明

记住,UBound 返回的数值比数组最后一个元素的下标大1.
发表于 2010-4-8 11:41:43 | 显示全部楼层
原来还能拿到括号外边来用
UBound ( 数组 [, 维度] )
发表于 2010-4-8 11:57:48 | 显示全部楼层
回复 8# nmgwddj
看来你还是没弄懂

UBound($sReg) -1 是数组的实际大小

你这样试试就明白了
MsgBox(0, '数组大小', UBound($sReg) -1 )
发表于 2010-4-8 12:34:49 | 显示全部楼层
回复 9# 水木子


    难道是减“1”
不是负“1”
???
发表于 2010-4-8 12:35:51 | 显示全部楼层
明白了明白了。多谢 从没有用过UBound
以后用到一定避免此问题
发表于 2010-4-8 12:36:24 | 显示全部楼层
明白了明白了。多谢 从没有用过UBound
以后用到一定避免此问题
nmgwddj 发表于 2010-4-8 12:35



    估计你理解成 step 了
发表于 2010-4-8 12:38:01 | 显示全部楼层
回复 12# afan


    恩。你简直太会了解人了 是WOMANE吗??是的话给我做老婆吧 太理解人了
发表于 2010-4-8 12:39:02 | 显示全部楼层
本帖最后由 afan 于 2010-4-8 12:40 编辑
回复  afan


    恩。你简直太会了解人了 是WOMANE吗??是的话给我做老婆吧 太理解人了
nmgwddj 发表于 2010-4-8 12:38


纯爷们,还是老爷们…… 你都知道我的扣扣是6位…… 多Old啊
发表于 2010-4-8 12:44:08 | 显示全部楼层
又是6位QQ,别提啦!伤心!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 15:18 , Processed in 0.095710 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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