找回密码
 加入
搜索
楼主: 奥斯丁

[AU3基础] 求正则 [已解决]

 火... [复制链接]
发表于 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    = -33  s      不是h 或p' & @CRLF & _
                '44dfghdfh     =                放弃' & @CRLF & _
                '55                 =                放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
                '66pp66  ph   =                放弃   空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b(?>\h[ph])', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中[0]元素为: ' & $Test[0])
_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 .
发表于 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    = -33  s      不是h 或p' & @CRLF & _
                '44dfghdfh     =                放弃' & @CRLF & _
                '55                 =                放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
                '66pp66  ph   =                放弃   空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b\h(?(?=[ph])[ph]|s)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中[0]元素为: ' & $Test[0])
_ArrayDisplay($Test, UBound($Test))
发表于 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    = -33  s      不是h 或p' & @CRLF & _
                '44dfghdfh     =                放弃' & @CRLF & _
                '55                 =                放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
                '66pp66  ph   =                放弃   空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)(^[+-]?\d*\.*\d+\b)\h([ph]|s)', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中[0]元素为: ' & $Test[0])
Local $Array[Int(UBound($Test)/2)][2]

For $i=0 to UBound($Test)-1 Step 2
        $Array[$i/2][0]=$Test[$i]
        $Array[$i/2][1]=$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    = -33  s      不是h 或p' & @CRLF & _
                '44dfghdfh     =                放弃' & @CRLF & _
                '55                 =                放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
                '66pp66  ph   =                放弃   空格前的字符必须是整数' & @CRLF
MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b\h([phs])', 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($Test), '其中[0]元素为: ' & $Test[0])
_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[0])
   $Test_2 = StringRegExp($str, '(?m)^[+-]?\d*\.*\d+\b(?>\h[ph])', 3)  ;  空格后的第一个字符, 管他是不是h 或p , 先提出来.
      MsgBox(0, '', '$Test_2= ' & $Test_2 ) ;  显示出 b 的

  if  $Test_2 ='h'   then  MsgBox(0, '', ' h  ok   $Test_2= ' & $Test_2 ) ;
  if  $Test_2 ='p'   then   MsgBox(0, '', ' p  ok   $Test_2= ' & $Test_2 ) ;
endif

;求正确的 $Test_2  正则.
发表于 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

谢谢,  不想用数组, 用的不好, 有恐惧症
发表于 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    = -33  s      不是h 或p' & @CRLF & _
                '44dfghdfh     =                放弃' & @CRLF & _
                '55                 =                放弃 (注: 即使55 的后面带空格也要放弃)' & @CRLF & _
                '66pp66  ph   =                放弃   空格前的字符必须是整数' & @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[phs])^[-]?\d+\h([phs])).*', '$1')
EndFunc
 楼主| 发表于 2012-4-28 12:24:37 | 显示全部楼层
本帖最后由 奥斯丁 于 2012-4-28 12:27 编辑

回复 24# 3mile

谢谢 ,  太复杂了, 还不完全是我想要的结果, 希望能以 20楼的代码修改完善 即可.

    到时把  Local $Str = '-1234 bbbb  '  里面的串改改就能测试不同的串了
发表于 2012-4-28 12:25:46 | 显示全部楼层
回复 22# 奥斯丁

$Test_2 = StringRegExp($str, '-?\d+\s+(.)', 3)

StringRegExp匹配出来的结果是数组,$Test_2[0] 就是空格后的第一个字符.

if  $Test_2[0] ='h'   then  MsgBox(0, '', ' h  ok   $Test_2[0]= ' & $Test_2[0] ) ;
if  $Test_2[0] ='p'   then   MsgBox(0, '', ' p  ok   $Test_2[0]= ' & $Test_2[0] ) ;
发表于 2012-4-28 12:30:18 | 显示全部楼层
回复 22# 奥斯丁

不想用数组就用StringRegExpReplace.

$Test_2 = StringRegExpReplace($str, "-?\d+\s+(.).+", "\1")

if  $Test_2 ='h'   then  MsgBox(0, '', ' h  ok   $Test_2= ' & $Test_2 ) ;
if  $Test_2 ='p'   then   MsgBox(0, '', ' p  ok   $Test_2= ' & $Test_2 ) ;
 楼主| 发表于 2012-4-28 12:36:48 | 显示全部楼层
回复 26# 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


是的, 但不能是空格.

     不想用数组就用StringRegExpReplace.

         $Test_2 = StringRegExpReplace($str, "-?\d+\s+(.).+", "\1")

    这个就不能达到效果
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-19 05:24 , Processed in 0.072628 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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