jchang 发表于 2010-4-28 16:22:54

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

类似文本如下:
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 = 1 Then
      $x = $cmdline
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)

jchang 发表于 2010-4-28 22:14:20

多谢,受你的启发,将脚本改为:#include <File.au3>
#include<array.au3>

Global $x
If $cmdline = 1 Then
      $x = $cmdline
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

能说明下你是要实现说明目的吗?

jchang 发表于 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 文件里

jchang 发表于 2010-4-29 08:25:40

多谢!就是我要的效果,看来是我写正则的问题了

aaeeff 发表于 2010-5-27 17:36:14

留印,需用。
页: [1]
查看完整版本: 如何用正则从文本提取以2,3,4位数字开头的行