3mile
发表于 2012-4-28 08:38:29
二楼没有解决吗?
还是一定要上代码?
<au3>#include <Array.au3>
Local $Str = _
'11 23pphh =11 2 不是h 或p' & @CRLF & _
'22 p9944 =22 p' & @CRLF & _
'-33 sdfh77 = -33s 不是h 或p' & @CRLF & _
'44dfghdfh = 放弃' & @CRLF & _
'55 = 放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
'66pp66ph = 放弃 空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b(?>\h)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中元素为: ' & $Test)
_ArrayDisplay($Test, UBound($Test))</au3>
奥斯丁
发表于 2012-4-28 10:47:01
本帖最后由 奥斯丁 于 2012-4-28 10:53 编辑
还没解决问题2
哦, 这正则太强大了, 看来我还是没有说清楚,
上述代码不是我想要的, 因为 $Test =22 p , 我要的是 $Test =p , 或例子3中的结果是 $Test =s ,而不是$Test =-33 s ,也就是空格后的第一个字符. 别理 h p .
3mile
发表于 2012-4-28 10:54:26
回复 17# 奥斯丁
#include <Array.au3>
Local $Str = _
'11 23pphh =11 2 不是h 或p' & @CRLF & _
'22 p9944 =22 p' & @CRLF & _
'-33 sdfh77 = -33s 不是h 或p' & @CRLF & _
'44dfghdfh = 放弃' & @CRLF & _
'55 = 放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
'66pp66ph = 放弃 空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b\h(?(?=)|s)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中元素为: ' & $Test)
_ArrayDisplay($Test, UBound($Test))
3mile
发表于 2012-4-28 11:03:42
二维数组:
#include <Array.au3>
Local $Str = _
'11 23pphh =11 2 不是h 或p' & @CRLF & _
'22 p9944 =22 p' & @CRLF & _
'-33 sdfh77 = -33s 不是h 或p' & @CRLF & _
'44dfghdfh = 放弃' & @CRLF & _
'55 = 放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
'66pp66ph = 放弃 空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)(^[+-]?\d*\.*\d+\b)\h(|s)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中元素为: ' & $Test)
Local $Array
For $i=0 to UBound($Test)-1 Step 2
$Array[$i/2]=$Test[$i]
$Array[$i/2]=$Test[$i+1]
Next
_ArrayDisplay($Array)
取空格后P,H,S
#include <Array.au3>
Local $Str = _
'11 23pphh =11 2 不是h 或p' & @CRLF & _
'22 p9944 =22 p' & @CRLF & _
'-33 sdfh77 = -33s 不是h 或p' & @CRLF & _
'44dfghdfh = 放弃' & @CRLF & _
'55 = 放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
'66pp66ph = 放弃 空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b\h()', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中元素为: ' & $Test)
_ArrayDisplay($Test)
奥斯丁
发表于 2012-4-28 11:05:11
本帖最后由 奥斯丁 于 2012-4-28 11:33 编辑
Local $Str = '-1234 bbbb'
Local $Test = StringRegExp($Str, '^(-?\d+)\s+\w+', 1) ; $Test = StringRegExp($Str, '([-+]?\d+)\s.+', 1)
If Not @error Then
MsgBox(0, '', '原字符串: ' & $Str & @CRLF & '匹配结果: ' & $Test)
$Test_2 = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b(?>\h)', 3);空格后的第一个字符, 管他是不是h 或p , 先提出来.
MsgBox(0, '', '$Test_2= ' & $Test_2 ) ;显示出 b 的
if$Test_2 ='h' thenMsgBox(0, '', ' hok $Test_2= ' & $Test_2 ) ;
if$Test_2 ='p' then MsgBox(0, '', ' pok $Test_2= ' & $Test_2 ) ;
endif
;求正确的 $Test_2正则.
lixiaolong
发表于 2012-4-28 11:27:27
-?\d+\s+(.)
奥斯丁
发表于 2012-4-28 11:34:33
本帖最后由 奥斯丁 于 2012-4-28 11:36 编辑
回楼上:
$Test_2 = StringRegExp($str, '-?\d+\s+(.)', 3);空格后的第一个字符, 管他是不是h 或p , 先提出来.
结果是空的
奥斯丁
发表于 2012-4-28 11:50:26
回复 19# 3mile
谢谢,不想用数组, 用的不好, 有恐惧症
3mile
发表于 2012-4-28 12:07:48
回复 23# 奥斯丁
#include <Array.au3>
Local $Str = _
'11 23pphh =11 2 不是h 或p' & @CRLF & _
'22 p9944 =22 p' & @CRLF & _
'-33 sdfh77 = -33s 不是h 或p' & @CRLF & _
'44dfghdfh = 放弃' & @CRLF & _
'55 = 放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
'66pp66ph = 放弃 空格前的字符必须是整数' & @CRLF & _
'-423 s'
MsgBox(0, '原字符串', $Str)
$Array=StringSplit($str,@CRLF,2+1)
For $i=0 to UBound($Array)-1
MsgBox(0,$Array[$i],Re_str($Array[$i]))
Next
Func Re_str($String)
Return StringRegExpReplace($String, '(?(?=^[-]?\d+\h)^[-]?\d+\h()).*', '$1')
EndFunc
奥斯丁
发表于 2012-4-28 12:24:37
本帖最后由 奥斯丁 于 2012-4-28 12:27 编辑
回复 24# 3mile
谢谢 ,太复杂了, 还不完全是我想要的结果, 希望能以 20楼的代码修改完善 即可.
到时把Local $Str = '-1234 bbbb'里面的串改改就能测试不同的串了
lixiaolong
发表于 2012-4-28 12:25:46
回复 22# 奥斯丁
$Test_2 = StringRegExp($str, '-?\d+\s+(.)', 3)
StringRegExp匹配出来的结果是数组,$Test_2 就是空格后的第一个字符.
if$Test_2 ='h' thenMsgBox(0, '', ' hok $Test_2= ' & $Test_2 ) ;
if$Test_2 ='p' then MsgBox(0, '', ' pok $Test_2= ' & $Test_2 ) ;
lixiaolong
发表于 2012-4-28 12:30:18
回复 22# 奥斯丁
不想用数组就用StringRegExpReplace.
$Test_2 = StringRegExpReplace($str, "-?\d+\s+(.).+", "\1")
if$Test_2 ='h' thenMsgBox(0, '', ' hok $Test_2= ' & $Test_2 ) ;
if$Test_2 ='p' then MsgBox(0, '', ' pok $Test_2= ' & $Test_2 ) ;
奥斯丁
发表于 2012-4-28 12:36:48
回复 26# lixiaolong
谢谢,正解!!!!!!!
lixiaolong
发表于 2012-4-28 12:38:38
回复 24# 3mile
楼主好像是要空格后的第一个任何字符.
奥斯丁
发表于 2012-4-28 12:48:58
本帖最后由 奥斯丁 于 2012-4-28 12:50 编辑
回复3mile
楼主好像是要空格后的第一个任何字符.
lixiaolong 发表于 2012-4-28 12:38 http://www.autoitx.com/images/common/back.gif
是的, 但不能是空格.
不想用数组就用StringRegExpReplace.
$Test_2 = StringRegExpReplace($str, "-?\d+\s+(.).+", "\1")
这个就不能达到效果