蓝袍道士 发表于 2011-8-19 14:18:56

正则问题,如何捕获最靠近限定条件的字串?[已解决]

本帖最后由 蓝袍道士 于 2011-8-21 07:17 编辑

;原字串有许多行,现简化如下:
$qfehtml="value=7 type=radio alertpayvalue=9 type=radio paypal.png"

;我写的正则表达式,目的是想提取value=9的数字9,但达不到目的。
$word='paypal';限定关键词是想提取对应的数字。
$pay = StringRegExp($qfehtml, '(?is)value=(\d+)\stype=radio.+?' & $word, 3)
MsgBox(0, '$pay', $pay);结果只有唯一,$pay显示会失败。希望是直接在$pay得到 结果,不需要另外处理。

骗子 发表于 2011-8-19 15:11:31

(?i)(?<=alertpayvalue=)(.*?) type=radio paypal.png


#include <Array.au3>
Local $Str = _
                ';原字串有许多行,现简化如下:' & @CRLF & _
                '$qfehtml="value=7 type=radio alertpayvalue=9 type=radio paypal.png"' & @CRLF & @CRLF & _
                ';我写的正则表达式,目的是想提取value=9的数字9,但达不到目的。' & @CRLF & _
                "$word='paypal';限定关键词是想提取对应的数字。" & @CRLF & _
                "$pay = StringRegExp($qfehtml, '(?is)value=(\d+)\stype=radio.+?' & $word, 3)" & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?i)(?<=alertpayvalue=)(.*?) type=radio paypal.png', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中元素为: ' & $Test)
_ArrayDisplay($Test, UBound($Test))

蓝袍道士 发表于 2011-8-19 17:07:09

谢谢楼上的指点,但这种方法不太理想,因为要确定(?<=alertpayvalue=),这修养在我的实际应用中不能解决问题。
实际应用中字串是用$qfehtml = _IEPropertyGet($oIE, "innerhtml")获取的网页源码。其中要处理的是一段是这样的:
<TR>
<TD width=2><INPUT onclick=mn.withdraw_update(1.05,10,0.05) value=7 type=radio
name=accounttype></TD>
<TD><IMG src="http://www.cashcafe.info/pic/alertpay.png"></TD>
<TD>$1.05</TD>
<TD>10 %</TD></TR>
<TR>
<TD width=2><INPUT onclick=mn.withdraw_update(1.05,10,0.00) value=9 type=radio
name=accounttype></TD>
<TD><IMG src="http://www.cashcafe.info/pic/paypal.png"></TD>
<TD>$1.05</TD>
<TD>10 %</TD></TR>

这有可能是三段或者更多的类似段落,其中的差别主要就是paypal和alertpay这二个地方或者三个以上的地方。其中$1.05也有可能不同。
我的企望是,只有二个关键词 value=和paypal就能提取相应的数字。这就是要求从paypal处开始从右向左搜索。这与正则表达的从左向右的原则相反。不知有没有这种问题的解决方法?

lixiaolong 发表于 2011-8-19 19:54:44

回复 3# 蓝袍道士

Local $Str = _
                '<TR>' & @CRLF & _
                '<TD width=2><INPUT onclick=mn.withdraw_update(1.05,10,0.05) value=7 type=radio ' & @CRLF & _
                'name=accounttype></TD>' & @CRLF & _
                '<TD><IMG src="http://www.cashcafe.info/pic/alertpay.png"></TD>' & @CRLF & _
                '<TD>$1.05</TD>' & @CRLF & _
                '<TD>10 %</TD></TR>' & @CRLF & _
                '<TR>' & @CRLF & _
                '<TD width=2><INPUT onclick=mn.withdraw_update(1.05,10,0.00) value=9 type=radio ' & @CRLF & _
                'name=accounttype></TD>' & @CRLF & _
                '<TD><IMG src="http://www.cashcafe.info/pic/paypal.png"></TD>' & @CRLF & _
                '<TD>$1.05</TD>' & @CRLF & _
                '<TD>10 %</TD></TR>'

Local $Test = StringRegExp($Str, '(?<=value=)\d', 3)

For $i = 0 To UBound($Test) - 1
        If $Test[$i] > 7 And $Test[$i] < 10 Then _
                        MsgBox(0, 'value', $Test[$i])
Next

蓝袍道士 发表于 2011-8-19 22:55:20

回复 4# lixiaolong


这不是正解,情况是多样的,应将所有value的值设成未知的,不能用来作判断条件

ghl781258 发表于 2011-8-20 13:50:01

用jquery吧,很简单

蓝袍道士 发表于 2011-8-21 07:10:56

本帖最后由 蓝袍道士 于 2011-8-21 07:15 编辑

;原字串有许多行,现简化如下:
$qfehtml="value=7 type=radio alertpayvalue=9 type=radio paypal.png"

;我写的正则表达式,目的是想提取value=9的数字9,但达不到目的。
$word='paypal';限定关键词是想提取对应的数字。
$pay = StringRegExp($qfehtml, '(?is)value=.+value=(\d+)\stype=radio.+?' & $word, 3)
MsgBox(0, '$pay', $pay);结果只有唯一,$pay显示会失败。希望是直接在$pay得到 结果,不需要另外处理。早上来了灵感,自己解决了。关键就是加“value=.+”
页: [1]
查看完整版本: 正则问题,如何捕获最靠近限定条件的字串?[已解决]