love5173 发表于 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分钟学的,学的不好,闹了大笑话

easefull 发表于 2011-5-31 11:04:23

取括号内的数字?
#include <Array.au3>
$txt='5566---5589----7788(7788)---5645'
$array=StringRegExp($txt, '\((.*?)\)', 3)
_ArrayDisplay($array)

easefull 发表于 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

love5173 发表于 2011-5-31 11:17:28

回复 3# easefull
你把变量改成常量了,$str1 这个值是在文本里取的,里面有带括弧的,有不带括弧的,根本不能确定是什么东西,你的解决方式跟我的类似,我想跟大家讨论一下有没有相应的正则处理方式来解决这个问题的

afan 发表于 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)

3mile 发表于 2011-5-31 11:26:26

回复 4# love5173
看不懂意思啊?

easefull 发表于 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

love5173 发表于 2011-5-31 12:29:57

回复 6# 3mile
问题已修改,看看现在是不是懂了

love5173 发表于 2011-5-31 12:30:11

回复 7# easefull
看看现在是不是懂了

kevinch 发表于 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)
NextAU3的正则老是觉得怪怪的,用vbs的我就可以实现

kevinch 发表于 2011-5-31 13:39:01

$a_Arr=StringRegExp($s_StrA,"(\d+)(?=.*?("&$s_StrB&"))",3)这一句要怎么处理才好呢?

love5173 发表于 2011-5-31 13:41:27

回复 6# 3mile
用十六进制如何

3mile 发表于 2011-5-31 13:57:24

回复 12# love5173
AFAN兄的解决方案应该是正解.请love5173兄采用.
将字符串转换成16进制处理是否有浪费效率之嫌?

love5173 发表于 2011-5-31 15:20:02

回复 13# 3mile
(.*)与.*(.*)处理起来是不一样的,前者不影响使用,后者直接就求不出东西

love5173 发表于 2011-5-31 15:22:13

回复 5# afan
刚才描述的不清楚 造成了大家处理的不是我问的问题
我问的是字符与半角()的组合后出现的问题,而(7788)恰好是种例外,请参见一楼
页: [1] 2
查看完整版本: 求一个正则[已解决]