jchang 发表于 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)

但是发现只能匹配第一个。
进行多行匹配时,有什么办法可以把所有内容都找出来呢?

水木子 发表于 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)

nmgwddj 发表于 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

修改好的

nmgwddj 发表于 2010-4-8 10:47:00

哦 我看错了。再给你写个

水木子 发表于 2010-4-8 11:10:00

谢谢楼上加分,客气啦!主要是LZ的问题比较简单而已。
正则处理这类问题效率确实高!

nmgwddj 发表于 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.

nmgwddj 发表于 2010-4-8 11:41:43

:face (22):原来还能拿到括号外边来用UBound ( 数组 [, 维度] )

水木子 发表于 2010-4-8 11:57:48

回复 8# nmgwddj
看来你还是没弄懂

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

你这样试试就明白了MsgBox(0, '数组大小', UBound($sReg) -1 )

nmgwddj 发表于 2010-4-8 12:34:49

回复 9# 水木子


    难道是减“1”
不是负“1”
???

nmgwddj 发表于 2010-4-8 12:35:51

明白了明白了。多谢 从没有用过UBound
以后用到一定避免此问题

afan 发表于 2010-4-8 12:36:24

明白了明白了。多谢 从没有用过UBound
以后用到一定避免此问题
nmgwddj 发表于 2010-4-8 12:35 http://www.autoitx.com/images/common/back.gif


    估计你理解成 step 了

nmgwddj 发表于 2010-4-8 12:38:01

回复 12# afan


    恩。你简直太会了解人了 是WOMANE吗??是的话给我做老婆吧 太理解人了:face (26):

afan 发表于 2010-4-8 12:39:02

本帖最后由 afan 于 2010-4-8 12:40 编辑

回复afan


    恩。你简直太会了解人了 是WOMANE吗??是的话给我做老婆吧 太理解人了
nmgwddj 发表于 2010-4-8 12:38 http://www.autoitx.com/images/common/back.gif

纯爷们,还是老爷们…… 你都知道我的扣扣是6位…… 多Old啊

水木子 发表于 2010-4-8 12:44:08

又是6位QQ,别提啦!伤心!:face (36):
页: [1] 2
查看完整版本: 正则表达式如何找出多行匹配的所有内容