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

[AU3基础] 已解决 求正则 如何用正则取出一段文本?

  [复制链接]
发表于 2012-8-24 05:08:14 | 显示全部楼层 |阅读模式
本帖最后由 Qokelate 于 2012-8-24 17:40 编辑
=========================================================
程序名称:AutoIt
汉化作者:
ALL:thesnoW
ADF:Sxd,rikthhpgf2005
EXP:kodin,Alan
中文论坛: http://www.AutoItX.com
start==>
绿色安装方法:解压缩到 任意目录.
绿色卸载方法:不爽删除就是.
正常安装方法:直接运行自解压程序.
正常卸载汉化:使用AU3工具箱>程序相关设置>卸载这个程序.
命令行安装  : "au3tool.exe /s"
命令行卸载  : "au3tool.exe /u"
AutoIt工具箱提供了安装卸载功能.
<==End
绿色安装方法:解压缩到 任意目录.
绿色卸载方法:不爽删除就是.
正常安装方法:直接运行自解压程序.
正常卸载汉化:使用AU3工具箱>程序相关设置>卸载这个程序.
命令行安装  : "au3tool.exe /s"
命令行卸载  : "au3tool.exe /u"
AutoIt工具箱提供了安装卸载功能.
======================================================
绿色安装方法:解压缩到 任意目录.
绿色卸载方法:不爽删除就是.
正常安装方法:直接运行自解压程序.
正常卸载汉化:使用AU3工具箱>程序相关设置>卸载这个程序.
命令行安装  : "au3tool.exe /s"
命令行卸载  : "au3tool.exe /u"
AutoIt工具箱提供了安装卸载功能.
======================================================
要求 (取出的行均不包含 start==> 或 <==End 本身 )

1. 如果不存在 start==> 行则不进行操作
2. 如果文本中存在单独的行  start==> 和 <==End 则取出它们之间的行
3. 如果文本中存在单独的行 start==> 但不存在 <==End 则取出 start==> 至文本最后内容
发表于 2012-8-24 09:51:06 | 显示全部楼层
本帖最后由 xiehuahere 于 2012-8-24 10:15 编辑

回复 1# Qokelate

将你给出的文本写入file.txt测试。

Local Const $oFile = ".\file.txt"
Local $aRecords, $str, $result 

If Not FileExists($oFile) Then Exit MsgBox(48 + 262144, "Warning", 'File "' & $oFile & '" does not exit!')
$str = FileRead($oFile)
If Not StringInStr($str, "start==>") Then Exit
If StringInStr($str, "<==End") Then
        $result = StringRegExpReplace($str, '(?is).*?start==>(.*?)<==End.*', '$1', 1)
Else
        $result = StringRegExpReplace($str, '(?is).*?start==>(.*)\z', '$1', 1)
EndIf
MsgBox(0, "", $result)

评分

参与人数 1金钱 +20 收起 理由
Qokelate + 20 谢谢帮忙

查看全部评分

发表于 2012-8-24 10:28:10 | 显示全部楼层
直接用正则自适应<==End存在和不存在的情况,也能取出符合要求的内容。

Local Const $oFile = ".\file.txt"
Local $array, $str

If Not FileExists($oFile) Then Exit MsgBox(48 + 262144, "Warning", 'File "' & $oFile & '" does not exit!')
$str = FileRead($oFile)
If Not StringInStr($str, "start==>") Then Exit
$array = StringRegExp($str, '(?is)start==>(.*?)((<==End.*)|\z)', 3)
If @error <> 0 Then Exit MsgBox(48 + 262144, "RegExp error", @error)
MsgBox(0, "", $array[0])

评分

参与人数 1金钱 +40 收起 理由
Qokelate + 40 谢谢帮忙

查看全部评分

发表于 2012-8-24 10:59:14 | 显示全部楼层
(?si)start==>\h*\v*(.*?)\v*(?=<==End|$)

评分

参与人数 1金钱 +20 收起 理由
Qokelate + 20 谢谢帮忙

查看全部评分

发表于 2012-8-24 17:07:13 | 显示全部楼层
回复 4# afan

看到正则强人出来了,顺便讨教两点:

1) 敢问 \h \v 制表符在这里起啥作用? 点号 . 不是能匹配任意字符的吗?

2) .*?(exp)  是否等同于 .*?(?=exp) ?
     (?=exp) 匹配表达式exp前面的位置,.*? 本来就是最小匹配,肯定在exp之前。
    我这样理解对吗?
 楼主| 发表于 2012-8-24 17:40:23 | 显示全部楼层
谢谢关注  问题解决   感谢各位~~~
发表于 2012-8-24 19:56:12 | 显示全部楼层
回复  afan

1) 敢问 \h \v 制表符在这里起啥作用? 点号 . 不 ...
xiehuahere 发表于 2012-8-24 17:07



    \h* 允许 “start==>” 后面有空格,\v* 则不会捕捉到首个空行。

.*?(exp)  不等同于 .*?(?=exp)
前面的 exp 为有效组,后面的 exp 不为有效组
发表于 2012-8-24 21:06:41 | 显示全部楼层
回复 7# afan


    嗯,知道区别了,多谢!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 13:04 , Processed in 0.122824 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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