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

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

 火... [复制链接]
发表于 2012-4-28 12:55:17 | 显示全部楼层
回复 29# lixiaolong
首先,应该用.*而不是.+
$str='-423 s'
$Test_2 = StringRegExpReplace($str, "-?\d+\s+(.).+", "\1")
msgbox(0,$str,$Test_2)
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 ) ;


其次,返回空值并不会影响后面的IF判断.
#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
        $Test_2 = Re_str($Array[$i])
        Switch $Test_2
                Case 'h'
                        MsgBox(0, $Array[$i], $Test_2 & ' ok   $Test_2= ' & $Test_2) ;
                Case 'p'
                        MsgBox(0, $Array[$i], $Test_2 & ' ok   $Test_2= ' & $Test_2) ;
                Case 's'
                        MsgBox(0, $Array[$i], $Test_2 & ' ok   $Test_2= ' & $Test_2) ;
        EndSwitch
Next

Func Re_str($String)
        Return StringRegExpReplace($String, '(?(?=^[-]?\d+\h[phs])^[-]?\d+\h([phs])).*', '$1')
EndFunc   ;==>Re_str

评分

参与人数 1金钱 +20 收起 理由
lixiaolong + 20 谢谢指正!

查看全部评分

发表于 2012-4-28 13:05:28 | 显示全部楼层
回复 31# 3mile

是应该用.*谢谢指正!

评分

参与人数 1金钱 +35 收起 理由
3mile + 35 小龙兄过谦了

查看全部评分

发表于 2012-4-28 13:17:10 | 显示全部楼层
关键的问题不在正则有没有问题,而是楼主对回复代码的不理解.
实际楼主在一楼并未明确表示其需要,而是分解成3个问题来问.

简单点理解应该是"一个单行字串,此字串以有符号整数开头,且整数后为一个空格,取空格后第一个包含[phs]的字符."
如:-123 p
 楼主| 发表于 2012-4-28 13:18:13 | 显示全部楼层
回复 31# 3mile


   当 $Str = '11 23pphh '  时  , 这个也是成立的 , 空格后面的2也应该能出来,  只不过我不清楚它是不是数值型的2还是其他的...
发表于 2012-4-28 13:30:17 | 显示全部楼层
26行改为
        Return StringRegExpReplace($String, '(?(?=^[-]?\d+\h[^\s])^[-]?\d+\h([^\s])).*', '$1')
 楼主| 发表于 2012-4-28 13:41:11 | 显示全部楼层
回复 35# 3mile


    您误会我的意思了,  是空格后的第一个任意字符, 而不是"取空格后第一个包含[phs]的字符."

所以 当 $Str = '11 23pphh '  时  , 这个也是成立的 , 空格后面的2也应该能出来,  只不过我不清楚它是不是数值型的2还是其他的...
发表于 2012-4-28 13:48:11 | 显示全部楼层
35楼没看?
还是非要上代码?
#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
        $Test_2 = Re_str($Array[$i])
        If ($Test_2=='h' Or $Test_2=='p' Or $Test_2=='s' Or $Test_2=='2') Then
                        MsgBox(0, $Array[$i], $Test_2 & ' ok   $Test_2= ' & $Test_2) ;
        EndIf
Next
 
Func Re_str($String)
    Return StringRegExpReplace($String, '(?(?=^[-]?\d+\h[^\s])^[-]?\d+\h([^\s])).*', '$1')
EndFunc   ;==>Re_str
 楼主| 发表于 2012-4-28 14:08:20 | 显示全部楼层
谢谢诸位 !!!!!   全通过!!!
发表于 2012-4-30 18:25:13 | 显示全部楼层
正则还是很难啊 学习
 楼主| 发表于 2012-5-1 19:19:00 | 显示全部楼层
本帖最后由 奥斯丁 于 2012-5-1 19:25 编辑

刚发现还不能说是完全通过的,  如果是这样的串:  22 完善23ppt  ,带中文的就出错了,  希望大侠能完善.

正则真不好弄.

请分别用 StringRegExp   和  StringRegExpReplace 两种方法补充完善我的2个问题, 谢谢.
发表于 2012-5-2 09:47:37 | 显示全部楼层
本帖最后由 lixiaolong 于 2012-5-2 09:49 编辑

回复 40# 奥斯丁

你说的出错是第一个问题还是第二个问题?

》如果是这样的串:  22 完善23ppt  
字符串前面有空格?你说的出错是什么?详细点.

把你的代码贴上来大家能帮你改改.
 楼主| 发表于 2012-5-3 10:40:15 | 显示全部楼层
回复 41# lixiaolong


    ;方法1   使用 StringRegExp
Local $Str = '-1234 结果bbbb34hh①h2  '
Local $Test = StringRegExp($Str, '^(-?\d+)\s+\w+', 1)    ; 问题在这里 =========   
If Not @error Then
   MsgBox(0, '', '原字符串: ' & $Str & @CRLF & '匹配结果: ' & $Test[0])
  $Test_2 = StringRegExp($str, '-?\d+\s+(.)', 3) ; 问题在这里 =========

  ;  使用汉字在空格后的第一个就没有显示了
      MsgBox(0, '', '$Test_2= ' & $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] ) ;
endif




;方法2  使用 StringRegExpReplace
Local $Str = '-1234 结果bbb34hh①h2  '
Local $Test = StringRegExpReplace($Str, '^(-?\d+)\s+\w+', 1)    ; 问题在这里 =========     
If Not @error Then
   MsgBox(0, '', '原字符串: ' & $Str & @CRLF & '匹配结果: ' & $Test );  应显示=========
  $Test_2 = StringRegExpReplace($str, "-?\d+\s+(.).*", "\1")  ; 这里好像没有问题 =========     

    MsgBox(0, '', '$Test_2= ' & $Test_2 )  

  if  $Test_2  ='h'   then  MsgBox(0, '', ' h  ok   $Test_2[0]= ' & $Test_2) ;
  if  $Test_2  ='p'   then   MsgBox(0, '', ' p  ok   $Test_2[0]= ' & $Test_2 ) ;
endif
发表于 2012-5-3 20:27:03 | 显示全部楼层
Local $Str = '-1234 结果bbbb34hh①h2  '
Local $Test = StringRegExp($Str, '(-?\d+)\h+(\H)', 1)
If @error Then Exit -1
MsgBox(0, '', $Test[0] & @CRLF & $Test[1])
If $Test[1] = 'h' Then MsgBox(0, '', '"h"  ok')
If $Test[1] = 'p' Then MsgBox(0, '', '"p"  ok')

评分

参与人数 1金钱 +20 收起 理由
lixiaolong + 20 精简了~

查看全部评分

发表于 2012-5-3 22:58:28 | 显示全部楼层
回复 42# 奥斯丁

第一个因为\w+,\w是匹配任何单词字符: a-z, A-Z, 0-9 或下划线 (_).
主要把它改为【任何的单字符】或者【非空白的字符】就可以了.

Local $Test = StringRegExp($Str, '^(-?\d+)\s+\S*', 1); 还可以用 . 或者 \H.

Local $Str = '-1234 结果bbbb34hh①h2  '
Local $Test = StringRegExp($Str, '^(-?\d+)\s+\w+', 1)    ; 问题就在这里
If Not @error Then ===因为空格后有了汉字,@error被设为1了(没有匹配项目),所以没有执行下面的代码.

第二个的表达式改为
Local $Test = StringRegExpReplace($Str, '^(-?\d+)\s+.*', '\1')    ; 问题在这里 =========
 楼主| 发表于 2012-5-4 00:01:19 | 显示全部楼层
本帖最后由 奥斯丁 于 2012-5-4 00:13 编辑

回复 44# lixiaolong

还有问题.    无论是方法1 还是方法2 ,  当Local $Str = '-12bb34 结果bbb34hh①h2  ' 时, 应该是@error 的.   
     
     方法1 ...............

    ;方法2  使用 StringRegExpReplace
Local $Str = '-12bb34 结果bbb34hh①h2  '
; Local $Test = StringRegExpReplace($Str, '^(-?\d+)\s+\w+', 1)    ; 问题在这里 =========     
Local $Test = StringRegExpReplace($Str, '^(-?\d+)\s+.*', '\1')    ; 问题在这里 =========

If Not @error Then
   MsgBox(0, '', '原字符串: ' & $Str & @CRLF & '匹配结果: ' & $Test );  应显示=========
  $Test_2 = StringRegExpReplace($str, "-?\d+\s+(.).*", "\1")  ; 这里好像没有问题 =========     

    MsgBox(0, '', '$Test_2= ' & $Test_2 )  

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


另外: 如果有空, 请以 '^(-?\d+)\s+\S*' 分解解释 "表达式" 的构成 .
        1:  - + 符号是在什么情况下用的,分别代表什么意思, 是怎么样构成"表达式" 的 ?
        2: 括号的作用该怎么理解, 与 '-?\d+\s+(.)'  比较, 括在不同的地方不同的内容, 讲解一下  
     3: 特殊符号使用 如 ^ ? . * 的使用方法, 或有什么特别要介绍的 .
       4:  不敢指望能完全明白, 只希望往后照猫画虎能有点谱 .   谢谢.........
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-17 03:48 , Processed in 0.079188 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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