找回密码
 加入
搜索
查看: 9011|回复: 17

[效率算法] 求一个正则[已解决]

 火.. [复制链接]
发表于 2011-5-31 10:32:54 | 显示全部楼层 |阅读模式
本帖最后由 love5173 于 2011-5-31 23:27 编辑

变量中含'()'的正则
A文档
1111----334
2222----556
3333----45(78)
44----84(76)
884----654(852)
B文档
334
556
45(78)
84(76)
654(852)
先在B中提取出索引,然后根据索引求A中----前面的数值
如果不明白再问我
我只有把括弧改成全角的一种方法,不知道有没有别的方法,江郎才尽了!
最后afan给出解决方案,是\Q\E的问题,作用是忽略元字符,就是像. () + 之类的符号,相当于每个符号都加了'\',因为我的正则是在正则表达式30分钟学的,学的不好,闹了大笑话
发表于 2011-5-31 11:04:23 | 显示全部楼层
取括号内的数字?
#include <Array.au3>
$txt='5566---5589----7788(7788)---5645'
$array=StringRegExp($txt, '\((.*?)\)', 3)
_ArrayDisplay($array)
发表于 2011-5-31 11:08:28 | 显示全部楼层
#include <Array.au3>
$txt='5566---5589----7788(7788)---5645'
$str1='\(7788\)'
$array=StringRegExp($txt, '---(.*?)----.*?' & $str1 & '---', 3)
_ArrayDisplay($array)
Exit
 楼主| 发表于 2011-5-31 11:17:28 | 显示全部楼层
回复 3# easefull
你把变量改成常量了,$str1 这个值是在文本里取的,里面有带括弧的,有不带括弧的,根本不能确定是什么东西,你的解决方式跟我的类似,我想跟大家讨论一下有没有相应的正则处理方式来解决这个问题的
发表于 2011-5-31 11:19:52 | 显示全部楼层
#include <Array.au3>
$txt = '5566---5589----7788(7788)---5645'
$str1 = '(7788)'
$array = StringRegExp($txt, '---(.*)----.*\Q' & $str1 & '\E-.*', 3)
_ArrayDisplay($array)

评分

参与人数 1金钱 +30 收起 理由
3mile + 30 学习了

查看全部评分

发表于 2011-5-31 11:26:26 | 显示全部楼层
回复 4# love5173
看不懂意思啊?
发表于 2011-5-31 12:13:16 | 显示全部楼层
本帖最后由 easefull 于 2011-5-31 12:59 编辑

回复 4# love5173

实在看不懂是啥意思.
甚至都不太清楚你这正则要取的是哪一部分的字符.

这意思是,在下面的格式下,取包含了特定key值的记录里面的bbb?
aaa---bbb----key----dddd

#include <Array.au3>
$sText = '5566---5589----7788(7788)---5645'

$sKey  = '(7788)'
$sKey  = StringRegExpReplace($sKey, '[\\^$.*+?|()[{]', '\\\0')
$sKey  = StringRegExpReplace($sKey, '[-\]]', '\\\0')

$Array = StringRegExp($sText, '---(.*?)----.*?' & $sKey & '---', 3)
_ArrayDisplay($Array)
Exit


顺便膜拜afan的
\Q.*\E
 楼主| 发表于 2011-5-31 12:29:57 | 显示全部楼层
回复 6# 3mile
问题已修改,看看现在是不是懂了
 楼主| 发表于 2011-5-31 12:30:11 | 显示全部楼层
回复 7# easefull
看看现在是不是懂了
发表于 2011-5-31 13:24:23 | 显示全部楼层
$h_FileA=FileOpen(@ScriptDir&"\a.txt",0)
$s_StrA=FileRead($h_FileA)
FileClose($h_FileA)
$h_FileB=FileOpen(@ScriptDir&"\b.txt",0)
$s_StrB=FileRead($h_FileB)
FileClose($h_FileB)
$s_StrB=StringRegExpReplace(StringReplace($s_StrB,@CRLF,"|"),"([\(\)])","\\$1")
$o_VBSREGEXP=ObjCreate("vbscript.regexp")
with $o_VBSREGEXP
        .global=1
        .multiline=1
        .pattern="\d+(?=.*?("&$s_StrB&"))"
        $Matches=.execute($s_StrA)
EndWith
for $Match in $Matches
        ConsoleWrite($Match.value&@crlf)
Next
AU3的正则老是觉得怪怪的,用vbs的我就可以实现

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-5-31 13:39:01 | 显示全部楼层
$a_Arr=StringRegExp($s_StrA,"(\d+)(?=.*?("&$s_StrB&"))",3)
这一句要怎么处理才好呢?
 楼主| 发表于 2011-5-31 13:41:27 | 显示全部楼层
回复 6# 3mile
用十六进制如何
发表于 2011-5-31 13:57:24 | 显示全部楼层
回复 12# love5173
AFAN兄的解决方案应该是正解.请love5173兄采用.
将字符串转换成16进制处理是否有浪费效率之嫌?
 楼主| 发表于 2011-5-31 15:20:02 | 显示全部楼层
回复 13# 3mile
(.*)与.*(.*)  处理起来是不一样的,前者不影响使用,后者直接就求不出东西
 楼主| 发表于 2011-5-31 15:22:13 | 显示全部楼层
回复 5# afan
刚才描述的不清楚 造成了大家处理的不是我问的问题
我问的是字符与半角()的组合后出现的问题,而(7788)恰好是种例外,请参见一楼
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 21:52 , Processed in 0.092384 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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