如何用正则从文本提取以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: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) 多谢,受你的启发,将脚本改为:#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)为何还是执行不了呢? 能说明下你是要实现说明目的吗? 回水木子:
我有一个文本,内容为:
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
这就是我想要实现的目地,多谢! 其实还可以更简单!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]