找回密码
 加入
搜索
查看: 5982|回复: 10

[效率算法] 请教正则表达式!

  [复制链接]
发表于 2013-2-27 20:13:44 | 显示全部楼层 |阅读模式
1.文本内容如下:
  磁盘 ###  状态           大小     可用     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  磁盘 0    联机              298 GB  1024 KB         
  磁盘 1    联机              931 GB      0 B

求提取:磁盘 0    联机              298 GB  1024 KB  红色部分!

2.文本内容如下:
  分区 ###       类型              大小     偏移量
  -------------  ----------------  -------  -------
  分区      1    主要                  50 GB  1024 KB
  分区      2    主要                  50 GB    50 GB
  分区      0    扩展的                198 GB   100 GB
  分区      3    逻辑                 198 GB   100 GB
  分区      4    OEM                 30 GB   100 GB

求提取:分区      1    主要                  50 GB  1024 KB 红色部分!

对AU3不是怎么太熟,英语也不好,看见正则头大一倍,望高手帮助!谢谢!
发表于 2013-2-27 21:24:16 | 显示全部楼层
本帖最后由 xms77 于 2013-2-27 21:28 编辑

### 友情提示:本脚本由 Au3.REHelper 于 2013/02/27 21:25 自动生成,不保证其正确性,请自行测试 ###
#include <Array.au3>
Local $Str = _
                '  分区      1    主要                  50 GB  1024 KB' & @CRLF & _
                '  分区      2    主要                  50 GB    50 GB' & @CRLF & _
                '  分区      0    扩展的                198 GB   100 GB' & @CRLF & _
                '  分区      3    逻辑                 198 GB   100 GB' & @CRLF & _
                '  分区      4    OEM                 30 GB   100 GB' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '分区      (\d+.+?GB)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中[0]元素为: ' & $Test[0])
_ArrayDisplay($Test, UBound($Test))
 楼主| 发表于 2013-2-27 21:42:52 | 显示全部楼层
本帖最后由 hanz_200 于 2013-2-27 21:45 编辑

感谢帮助,提取到的红色部分需要再次的正则,才能得到最总的结果!
比如:
$1[0][1]=4
$1[0][2]=OEM
$1[0][3]=30 GB

还有就是大小不一定是GB,也有可能是MB!
发表于 2013-2-27 21:58:05 | 显示全部楼层
这两段可以通用一个表达式
#include <Array.au3>
Local $Str = ClipGet()
Local $Test = StringRegExp($str, '(?<=磁盘|分区)\h+(\d+)\h+(\S+)\h+(\d+\h+\S+)', 1)
_ArrayDisplay($Test, UBound($Test))
 楼主| 发表于 2013-2-27 22:40:48 | 显示全部楼层
为什么返回值只有一组啊?
发表于 2013-2-28 00:28:07 | 显示全部楼层
本帖最后由 afan 于 2013-2-28 00:34 编辑
为什么返回值只有一组啊?
hanz_200 发表于 2013-2-27 22:40



    你是两个文件,当然要分开测试。只是代码通用罢了。正则的标志特意为"1",就是避免两个文件连在一起测试,取多了以为错误了。

如果你想两个文件连在一起测试,当然修改一下即可。不过那样不是增加了许多无谓的操作吗?
发表于 2013-2-28 04:56:40 | 显示全部楼层
回复 6# afan

别多说了,看来是搞事的。或者就根本不知道自己的要求
 楼主| 发表于 2013-2-28 06:49:52 | 显示全部楼层
回复  afan

别多说了,看来是搞事的。或者就根本不知道自己的要求
netegg 发表于 2013-2-28 04:56



    可能我说的有点模糊,对不起了,但可不是什么搞事的。
 楼主| 发表于 2013-2-28 07:06:29 | 显示全部楼层
我们公司是联想专卖店,总是大批量出联想的商用机器,每次都上百台,一般机器自带的系统不是DOS,LINUX,就是WINDOWS 7。客户基本都要装XP,所以就要求我们改系统,以前是全盘GHOST,后来我嫌全盘太慢(联想有OEM隐藏分区,很大),就使用Diskpart脚本进行分区,然后单分区GHOST,每次型号都不一样,每次都需要改配置文件。(分区的时候不能用clean命令来清理全部分区,OEM隐藏分区涉及到一键恢复不能删除)
每次到新类型的机器,我得先在机器上运行diskpart,选择磁盘后 select disk 0,列出分区 list partition。下面是运行的结果:

Microsoft DiskPart 版本 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
在计算机上: LENOVO-PC

磁盘 0 现在是所选磁盘。

  分区 ###       类型              大小     偏移量
  -------------  ----------------  -------  -------
  分区      1    主要                  50 GB  1024 KB
  分区      2    主要                  50 GB    50 GB
  分区      0    扩展的                198 GB   100 GB
  分区      3    逻辑                 198 GB   100 GB
  分区      4    OEM                 30 GB   30 GB
看前面的分区号,编写脚本:
SELECT DISK 0
SELECT PARTITION 1
DEL PARTITION
SELECT PARTITION 2
DEL PARTITION
SELECT PARTITION 3
DEL PARTITION
SELECT PARTITION 0
DEL PARTITION
CREATE PARTITION PRIMARY SIZE=51208
FORMAT QUICK
ASSIGN
ACTIVE
CREATE PARTITION EXTENDED
CREATE PARTITION LOGICAL SIZE=133125
FORMAT QUICK
ASSIGN
CREATE PARTITION LOGICAL SIZE=133125
FORMAT QUICK
ASSIGN
CREATE PARTITION LOGICAL
FORMAT QUICK
ASSIGN
EXIT
然后,用diskpart /s 来带这个脚本运行。
后来我想能不能自动删除除了OEM分区以外的分区于是有了上面的难题!
(用diskpart的原因是它可以分区4K自动对其,需要windows 7以上的pe支持)

所以感谢A大和xms77,因为我对au3确实不怎么懂!
发表于 2013-2-28 09:14:48 | 显示全部楼层
分区装系统有这么麻烦吗,重新分区加装系统顶多也就是十分钟的事情。
 楼主| 发表于 2013-2-28 13:37:13 | 显示全部楼层
新硬盘当然要4K对齐了,用diskpart可以直接对齐,一个脚本就分区好了,这还麻烦?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 02:47 , Processed in 0.075769 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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