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")

    这个就不能达到效果
页: 1 [2] 3 4
查看完整版本: 求正则 [已解决]