3mile
发表于 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' thenMsgBox(0, '', ' hok $Test_2= ' & $Test_2 ) ;
if$Test_2 ='p' then MsgBox(0, '', ' pok $Test_2= ' & $Test_2 ) ;
其次,返回空值并不会影响后面的IF判断.
#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
$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)^[-]?\d+\h()).*', '$1')
EndFunc ;==>Re_str
lixiaolong
发表于 2012-4-28 13:05:28
回复 31# 3mile
是应该用.*谢谢指正!
3mile
发表于 2012-4-28 13:17:10
关键的问题不在正则有没有问题,而是楼主对回复代码的不理解.
实际楼主在一楼并未明确表示其需要,而是分解成3个问题来问.
简单点理解应该是"一个单行字串,此字串以有符号整数开头,且整数后为一个空格,取空格后第一个包含的字符."
如:-123 p
奥斯丁
发表于 2012-4-28 13:18:13
回复 31# 3mile
当 $Str = '11 23pphh '时, 这个也是成立的 , 空格后面的2也应该能出来,只不过我不清楚它是不是数值型的2还是其他的...
3mile
发表于 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
您误会我的意思了,是空格后的第一个任意字符, 而不是"取空格后第一个包含的字符."
所以 当 $Str = '11 23pphh '时, 这个也是成立的 , 空格后面的2也应该能出来,只不过我不清楚它是不是数值型的2还是其他的...
3mile
发表于 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 = -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
$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
谢谢诸位 !!!!! 全通过!!!
vason1019
发表于 2012-4-30 18:25:13
正则还是很难啊 学习
奥斯丁
发表于 2012-5-1 19:19:00
本帖最后由 奥斯丁 于 2012-5-1 19:25 编辑
刚发现还不能说是完全通过的,如果是这样的串:22 完善23ppt,带中文的就出错了,希望大侠能完善.
正则真不好弄.
请分别用 StringRegExp 和StringRegExpReplace 两种方法补充完善我的2个问题, 谢谢.
lixiaolong
发表于 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)
$Test_2 = StringRegExp($str, '-?\d+\s+(.)', 3) ; 问题在这里 =========
;使用汉字在空格后的第一个就没有显示了
MsgBox(0, '', '$Test_2= ' & $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 ) ;
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' thenMsgBox(0, '', ' hok $Test_2= ' & $Test_2) ;
if$Test_2='p' then MsgBox(0, '', ' pok $Test_2= ' & $Test_2 ) ;
endif
afan
发表于 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 & @CRLF & $Test)
If $Test = 'h' Then MsgBox(0, '', '"h"ok')
If $Test = 'p' Then MsgBox(0, '', '"p"ok')
lixiaolong
发表于 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' thenMsgBox(0, '', ' hok $Test_2= ' & $Test_2) ;
if$Test_2='p' then MsgBox(0, '', ' pok $Test_2= ' & $Test_2 ) ;
endif
另外: 如果有空, 请以 '^(-?\d+)\s+\S*' 分解解释 "表达式" 的构成 .
1:- + 符号是在什么情况下用的,分别代表什么意思, 是怎么样构成"表达式" 的 ?
2: 括号的作用该怎么理解, 与 '-?\d+\s+(.)'比较, 括在不同的地方不同的内容, 讲解一下
3: 特殊符号使用 如 ^ ? . * 的使用方法, 或有什么特别要介绍的 .
4:不敢指望能完全明白, 只希望往后照猫画虎能有点谱 . 谢谢.........