找回密码
 加入
搜索
查看: 3051|回复: 7

[AU3基础] 如何用正则从文本提取以2,3,4位数字开头的行

  [复制链接]
发表于 2010-4-28 16:22:54 | 显示全部楼层 |阅读模式
类似文本如下:
  RESTRAINT REPORT, Loads on Restraints                                         
  (OCC)COMBINATION #  1                                                         
                                                                                
         ------Forces( N.)-------     -----Moments( N.m. )-----                 
  NODE      FX       FY       FZ         MX       MY       MZ                  
                                                                                
    10    2100     1684     6829       9691     9853     2136   Rigid ANC      
   130       0        0     2740          0        0        0   Rigid +Z        
   130       0     2964        0          0        0        0   Rigid GUI
  2190       0     8928        0          0        0        0   Rigid Y         
10010    2100     1684     6829       9691     9853     2136   Displ. Reaction
10070       0        0     1736          0        0        0   Displ. Reaction

要提取出 以2,3,4位数字开头的行,如下:
    10    2100     1684     6829       9691     9853     2136   Rigid ANC      
   130       0        0     2740          0        0        0   Rigid +Z        
   130       0     2964        0          0        0        0   Rigid GUI
  2190       0     8928        0          0        0        0   Rigid Y   

我的脚本如下:
#include <File.au3>
#include<array.au3>

Global $x
If $cmdline[0] = 1 Then
        $x = $cmdline[1]
EndIf
$file2 = FileOpen(FileGetLongName($x), 0)
If $file2 = -1 Then
        MsgBox(0, "错误", "不能打开文件.")
        Exit
EndIf
       
$file2 = FileRead($file2)
FileClose($file2)

FileDelete(@ScriptDir & "\输出.txt")
$file3 = FileOpen(@ScriptDir & "\输出.txt", 2)
If $file3 = -1 Then
        MsgBox(0, "错误", "不能打开输出文件.")
        Exit
EndIf

Local $sText
$sReg = StringRegExp($file2, '\n\s+\d{2}.*|\n\s+\d{3}.*|\n\s+\d{4}.*', 2);
For $i = 0 To UBound($sReg) -1
     $sText &= $sReg[$i] & @CRLF
         MsgBox(0, '匹配结果', $sReg[$i])
Next

FileWrite($file3, $sText)
FileClose($file3)

经测试,上述脚本提取不出任何值,请问问题是出在哪里呢?
发表于 2010-4-28 19:01:57 | 显示全部楼层
本帖最后由 水木子 于 2010-4-28 19:05 编辑
Local $Result
$Text = '10    2100     1684     6829       9691     9853     2136   Rigid ANC' & @CRLF & _
                '130       0        0     2740          0        0        0   Rigid +Z' & @CRLF & _
                '130       0     2964        0          0        0        0   Rigid GUI' & @CRLF & _
                '2190       0     8928        0          0        0        0   Rigid Y' & @CRLF & _
                '10010    2100     1684     6829       9691     9853     2136   Displ. Reaction' & @CRLF & _
                '10070       0        0     1736          0        0        0   Displ. Reaction'

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

$Reg = StringRegExp(@CRLF & $Text, '\n(\d{2,4}\s+.+)', 3)
For $i = 0 To UBound($Reg) - 1
        $Result &= $Reg[$i]
Next

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

评分

参与人数 1威望 +3 收起 理由
afan + 3

查看全部评分

 楼主| 发表于 2010-4-28 22:14:20 | 显示全部楼层
多谢,受你的启发,将脚本改为:
#include <File.au3>
#include<array.au3>

Global $x
If $cmdline[0] = 1 Then
        $x = $cmdline[1]
EndIf
$file2 = FileOpen(FileGetLongName($x), 0)
If $file2 = -1 Then
        MsgBox(0, "错误", "不能打开文件.")
        Exit
EndIf
       
$file2 = FileRead($file2)
FileClose($file2)

FileDelete(@ScriptDir & "\输出.txt")
$file3 = FileOpen(@ScriptDir & "\输出.txt", 2)
If $file3 = -1 Then
        MsgBox(0, "错误", "不能打开输出文件.")
        Exit
EndIf

Local $sText
$sReg = StringRegExp($file2, '\n(\d{2,4}\s+.+)', 3);
For $i = 0 To UBound($sReg) -1
         $sText &= $sReg[$i] 
         MsgBox(0, '匹配结果', $sReg[$i])
Next

FileWrite($file3, $sText)
FileClose($file3)
为何还是执行不了呢?
发表于 2010-4-28 22:23:54 | 显示全部楼层
能说明下你是要实现说明目的吗?
 楼主| 发表于 2010-4-28 22:54:29 | 显示全部楼层
回水木子:
我有一个文本,内容为:
RESTRAINT REPORT, Loads on Restraints                                         
  (OCC)COMBINATION #  1                                                         
                                                                                
         ------Forces( N.)-------     -----Moments( N.m. )-----                 
  NODE      FX       FY       FZ         MX       MY       MZ                  
                                                                                
    10    2100     1684     6829       9691     9853     2136   Rigid ANC      
   130       0        0     2740          0        0        0   Rigid +Z        
   130       0     2964        0          0        0        0   Rigid GUI
  2190       0     8928        0          0        0        0   Rigid Y         
10010    2100     1684     6829       9691     9853     2136   Displ. Reaction
10070       0        0     1736          0        0        0   Displ. Reaction
现在要把这个文本拖放到au3程序上,则自动生成另一个文本,取出了以2,3,4位数字开头的行,如下:
    10    2100     1684     6829       9691     9853     2136   Rigid ANC      
   130       0        0     2740          0        0        0   Rigid +Z        
   130       0     2964        0          0        0        0   Rigid GUI
  2190       0     8928        0          0        0        0   Rigid Y   

这就是我想要实现的目地,多谢!
发表于 2010-4-28 23:30:22 | 显示全部楼层
其实还可以更简单!
Local $Result
$Text = FileRead(@ScriptDir & '\Text.txt') ;将需要匹配的字符串保存在脚本同目录下 Text.txt 文件里
MsgBox(0, '原字符串', $Text)

$Reg = StringRegExp(@CRLF & $Text, '\n\s*[^\d](\d{2,4}\s+.+)', 3)
For $i = 0 To UBound($Reg) - 1
        $Result &= $Reg[$i] & @CRLF
Next

MsgBox(0, '匹配结果', $Result)
FileWrite(@ScriptDir & '\匹配结果.txt', $Result) ;匹配结果将会存放在脚本同目录下 匹配结果.txt 文件里

评分

参与人数 1金钱 +10 收起 理由
jchang + 10 多谢水木子

查看全部评分

 楼主| 发表于 2010-4-29 08:25:40 | 显示全部楼层
多谢!就是我要的效果,看来是我写正则的问题了
发表于 2010-5-27 17:36:14 | 显示全部楼层
留印,需用。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-22 05:33 , Processed in 0.083253 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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